一、给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 true ;否则,返回 false 。 // 示例 1: // 输入:arr = [2,6,4,1] // 输出:false // 解释:不存在连续三个元素都是奇数的情况 // 示例 2: // 输入:arr = [1,2,34,3,4,5,7,23,12] // 输出:true // 解释:存在连续三个元素都是奇数的情况,即 [5,7,23]
//方法一
public static boolean threeConsecutiveOdds1(int[] arr) {
if (arr.length < 3) {
return false;
}
for (int i = 0; i < arr.length - 2; i++) {
int count = 0;
for (int j = i; j < i + 3; j++) {
if (arr[j] % 2 != 0) {
count++;
} else {
break;
}
}
if (count == 3) {
return true;
}
}
return false;
}
执行结果:
//方法二
public static boolean threeConsecutiveOdds2(int[] arr) {
for (int i = 0; i < arr.length-2; i++) {
if((arr[i] %2 == 1)&&(arr[i+1] %2 == 1)&&(arr[i+2] %2 == 1)){
return true;
}
}
return false;
}
执行结果:
//方法三
public static boolean threeConsecutiveOdds3(int[] arr) {
if(arr == null) return false;
int consecutiveOdds = 0;
for (int i = 0; i < arr.length; i++) {
if(arr[i] %2 == 1){
consecutiveOdds++;
}else{
consecutiveOdds = 0;
}if(consecutiveOdds == 3){
return true;
}
}
return false;
}
执行结果:
//方法四
public static boolean threeConsecutiveOdds4(int[] arr){
for (int i = 0; i <arr.length-2 ; i++) {
int j = 0;
for ( j = i; j <= i+2; j++) {
if (arr[j]%2==0){
break;
}
}
if (j>i+2){
return true;
}
}
return false ;
}
执行结果:
二、 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
// 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 // 示例 1: // 输入:[3,2,3] // 输出:3 // 示例 2: // 输入:[2,2,1,1,1,2,2] // 输出:2
public static int findNum(int[] arr){
for (int i = 0; i < arr.length; i++) {
int count = 0;
for (int j = i; j < arr.length; j++) {
if(arr[i] == arr[j]){
count++;
}
}if(count > arr.length/2){
return arr[i];
}
}
return -1;
}
执行结果:
三、只出现一次的数字
// 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 // 输入: [2,2,1] // 输出: 1 // 示例 2: // 输入: [4,1,2,1,2] // 输出: 4
public static int singleNum(int[] num) {
// 将所有数组元素进行一次异或+
// 结果一定是出现一次的元素
int ret = 0;
for (int i :num) {
ret = ret ^ i;
}
return ret;
}
执行结果:
四、两数之和
// 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 // 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 // 你可以按任意顺序返回答案。 // 示例 1: // 输入:nums = [2,7,11,15], target = 9 // 输出:[0,1] // 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
public static int[] twoSum(int[] num, int target) {
int[] ret = new int[2];
// 双引用法
// 从头给后遍历集合,边遍历边从后给前找是否有num[j] = target - num[i]
for (int i = 0; i < num.length; i++) {
for (int j = num.length - 1; j > i; j--) {
if (num[i] + num[j] == target) {
ret[0] = i;
ret[1] = j;
}
}
}
return ret;
}
执行结果:
五、冒泡排序
// 给定一个整型数组, 实现冒泡排序(升序排序)
//方法一
public static void bubbleSort1(int[] arr){
for (int i = 0; i <arr.length-1; i++) {
for (int j = 0; j <arr.length-1-i ; j++) {
if(arr[j] > arr[j+1]){
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
}
执行结果:
//方法二
public static void bubbleSort2(int[] num) {
// 未排序的数组 [0.....num.length-1]
// 已排序的数组 []
// 需要比较多少趟
// 每当一趟走完(两两交换元素,把大元素扔到后面),最大的元素一定出现在最后位置
// 当最后一趟只有一个元素时,此时整个数组已经有序了,不再需要交换
for (int i = 0; i < num.length - 1; i++) {
// 两两元素做交换处理
// 真正需要比较的元素个数
// 优化(若内层循环没有交换元素,说明此时数组已经有序了!!)
boolean swapFlag = true;
for (int j = 0; j < num.length - i - 1; j++) {
if (num[j] > num[j + 1]) {
// swap
int tmp = num[j];
num[j] = num[j + 1];
num[j + 1] = tmp;
swapFlag = false;
}
}
if (swapFlag) {
System.out.println("若此时没有元素做交换,此时数组已经有序");
break;
}
}
}
执行结果:
六、
// 数组是否有序 // 给定一个整型数组, 判定数组是否有序(递增)
public static boolean judgeSort(int[] arr){
for (int i = 0; i <arr.length-1 ; i++) {
if(arr[i]>=arr[i+1]){
return false;
}
}
return true;
}
执行结果:
七、
// 二分查找 // 给定一个有序整型数组, 实现二分查找
//方法一
public static int binarySearch1(int[] arr,int toFind){
int left=0;
int right=arr.length-1;
while(left<=right){
int mid=(left+right)/2;
if(toFind<arr[mid]){
right=mid-1;
}else if(toFind>arr[mid]){
left=mid+1;
} else{
return mid;
}
}
return -1;
}
执行结果:
//方法二
public static int binarySearch2(int[] num, int toFind) {
return binarySearchInternal(num,toFind,0,num.length - 1);
}
// 递归
public static int binarySearchInternal(int[] num, int toFind, int left, int right) {
// 此时num为空区间
if (left > right) {
return -1;
}
int mid = (left + right) >> 1;
if (num[mid] == toFind) return mid;
else if (toFind < num[mid]) {
// 在←半区间查找
return binarySearchInternal(num,toFind,left,mid - 1);
}else {
// 在右半区间找
return binarySearchInternal(num,toFind,mid + 1,right);
}
}
执行结果:
八、
// 数组的拷贝 // 实现一个方法 copyOf, 对一个整型数组进行拷贝, 得到一个新的数组.
public static int[] copyOf(int[] arr){
int[] brr=new int[arr.length];
for (int i = 0; i <brr.length ; i++) {
brr[i]=arr[i];
}
return brr;
}
执行结果:
九、
// 数组转字符串 // 实现一个方法 toString, 把一个整型数组转换成字符串. 例如数组 {1, 2, 3} , 返回的字符串为 "[1, 2, 3]", 注意 逗号 的位置和数量.
public static String toString(int[] arr){
String ret = "[";
for (int i = 0; i < arr.length; i++) {
ret += arr[i];
if (i != arr.length - 1) {
ret += ",";
}
}
ret += "]";
return ret;
}
执行结果: