1.递归求解汉诺塔问题
拿三个为例子
先从A设法拿走两个盘子到B上,再拿一个盘子到C上,再从B上挪走一个到A,再挪下面的到C上
如果有N个盘子,我们也一样的步骤,先设法拿N-1个盘子到B,再拿最底部的盘子到C,再从B上拿走(N-1)-1个盘子到A,以此类推,直到所有盘子都到C上
public static void move(char pos1, char pos2){
System.out.print(pos1+" => "+pos2+" ");
}
/**
* @param n 盘子数目
* @param pos1 起始位置
* @param pos2 中转位置
* @param pos3 目的位置
*/
public static void hanio(int n, char pos1, char pos2, char pos3){
if(n == 1){
move(pos1,pos3);
return;
}
hanio(n-1,pos1,pos3,pos2);//第一次目的地是pos2
move(pos1,pos3);
hanio(n-1, pos2,pos1,pos3);
}
public static void main(String[] args) {
hanio(1,'A','B','C');
System.out.println();
hanio(2,'A','B','C');
System.out.println();
hanio(3,'A','B','C');
System.out.println();
}
2.实现一个方法 transform, 以数组为参数, 循环将数组中的每个元素 乘以 2 , 并设置到对应的数组元素上. 例如 原数组为 {1, 2, 3}, 修改之后为 {2, 4, 6}
//方式一:扩大的还是原来的数组,这样做的不好的地方是,改变了原来数组的值
public static void func2(int[] array) {
for (int i = 0; i < array.length; i++) {
array[i] = array[i]*2;
}
}
//方式二:扩大的新的数组,没有修改原来的值
public static int[] func3(int[] array) {
int[] tmp = new int[array.length];//
for (int i = 0; i < array.length; i++) {
tmp[i] = array[i]*2;
}
return tmp;
}
3.调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。
如数组:[1,2,3,4,5,6]
调整后可能是:[1, 5, 3, 4, 2, 6]
设置两个“指针”:i和j, i在前往后走,j在后往前走,i和j有一个遇到奇数就交换
public static void fun3(int[] array){
int i = 0;
int j = array.length-1;
while(i
4.给定一个有序整型数组, 实现二分查找
public static int binarySearch(int[] array,int key) {
int left = 0;
int right = array.length-1;
while (left <= right) {
int mid = (left+right)/2;
if(array[mid] == key) {
return mid;
}else if(array[mid] < key) {
left = mid+1;
}else {
right = mid-1;
}
}
return -1;//代表没有找到这个数字
}
5.给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
暴力解法:
设置i和j,i在第一个,j往后遍历,看看j位置的值与i位置的值相加是不是等于目标值,一轮遍历后没有再把i往右边移动
public static int[] findnumber(int[] array, int target){
int[] ret = {-1,-1};
for (int i = 0; i < array.length; i++) {
for (int j = i+1; j < array.length; j++) {
if(array[i] + array[j] == target){
//return new int[]{i,j};
ret[0] = i;
ret[1] = j;
}
}
}
return ret;
}
6.给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
用异或方法,相同元素异或 = 0;0异或n = n
相同元素异或完之后相当于消去,消到后面发现有异或结果是某个元素,说明那个元素只出现1次
public int singleNumber(int[] nums) {
// 用异或运算的性质可以巧妙的解决这个问题,因为数组中只有一个数字出现一次
// 则其他出现两次的数字用异或运算后都是0,最终整个数组异或运算的结果即为所求。
int ret = 0;
for (int i : nums) {
ret ^= i;
}
return ret;
}
7.给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3] 输出:3
示例 2:
输入:[2,2,1,1,1,2,2] 输出:2
/**
* 排序法
* 将数组排序后,数组n/2的元素一定是众数
*/
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
摩尔投票法:
数组[1,1,1,2,2,2,2]
1和2要参加竞选,给1投一票,再给2投一票,这相当于是抵消了,数组后面剩一个2没人跟他抵消,所以2就是最多的元素
public int majorityElement(int[] nums) {
int candidate = 0;
int count = 0;
for (int num : nums) {
if (count == 0) {
candidate = num;
count = 1;
} else if (num == candidate) {
count++;
} else {
count--;
}
}
return candidate;
}
8.给你一个整数数组 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 fun5(int[] arr){
int count = 0;
for (int i = 0; i < arr.length; i++) {
if(arr[i] % 2 != 0){
count++;
if(count == 3){
return true;
}
}else{
count = 0;
}
}
return false;
}