兔子问题(斐波那契数列规律)
台阶问题 (兔子问题变种,递归规律)
素数问题(判断素数、质数方式)
水仙花数问题(数字分解)
查找算法(二分查找)
排序算法(选择排序,冒泡排序,快速排序)
兔子问题,重点是找到规律。
斐波那契数列 1、1、2、3、5、8、13、21、34、55
规律为:F(n)=F(n-1)+F(n-2)(n>2,n∈N*)
public static voidmain(String[] args) {for (int i = 1; i <= 20; i++)
System.out.println("第" + i + "个月:" +function(i));
}private static int function(intx) {if (x == 1 || x == 2)return 1;else
return function(x - 1) + function(x - 2);
}
台阶问题:有n步台阶,一次只能上1步或2步,共有多少种走法?
规律为:F(n)=F(n-1)+F(n-2)
public static voidmain(String[] args) {
System.out.println(function(10));
}private static int function(intn) {if (n <= 2) {returnn;
}return function(n - 1) + function(n - 2);
}
判断素数(质数),重点是记住判断方式。
判断number是否是素数有这么几种方法:
(1)用2至number-1之间的所有数去整除number,如果有一个能被整除,说明number是非素数;除非所有的数都不能被整除,才说明number是素数.
(2)用2至number/2之间的所有数去整除number,如果有一个能被整除,说明number是非素数;除非所有的数都不能被整除,才说明number是素数.
(3)用2至number的平方根之间的所有数去整除number,如果有一个能被整除,说明number是非素数;除非所有的数都不能被整除,才说明number是素数.
public static voidmain(String[] args) {for (int i = 1; i <= 200; i++) {if(function(i)) {
System.out.println("素数:" +i);
}
}
}private static boolean function(intx) {for (int i = 2; i <= x / 2; i++) {if (x % i == 0) {return false;
}
}return true;
}
水仙花数,重点是分解百位、十位、个位。
public static voidmain(String[] args) {for (int i = 1; i <= 999; i++) {if(function(i)) {
System.out.println("水仙花数:" +i);
}
}
}private static boolean function(intx) {int i = 0, j = 0, k = 0;
i= x / 100;
j= (x % 100) / 10;
k= x % 10;if (x == i * i * i + j * j * j + k * k *k)return true;else
return false;
}
查找算法(二分查找)
对于二分查找算法要求, 查找前的数据必须是已经排好序的, 然后得到数组的开始位置start和结束位置end, 取中间位置mid的数据a[mid]跟待查找数据key进行比较, 若 a[mid] > key, 则取end = mid - 1; 若 a[mid] < key, 则取start = mid + 1; 若 a[mid] = key 则直接返回当前mid为查找到的位置. 依次遍历直到找到数据或者最终没有该条数据.
public static voidmain(String[] args) {int[] nums = new int[] { 1, 3, 5, 7, 9, 11, 13, 17};
System.out.println(function(nums,5));
}private static int function(int[] nums, intkey) {int start = 0;int end = nums.length - 1;int mid = -1;while (start <=end) {
mid= (start + end) / 2;if (nums[mid] ==key) {return mid;//已经查到返回!
} else if (nums[mid] >key) {
end= mid - 1;
}else if (nums[mid]
start= mid + 1;
}
}return -1;
}
选择排序,冒泡排序,快速排序
public static voidmain(String[] args) {int[] nums = new int[] { 6, 3, 8, 2, 9, 1};
bubbleSort(nums);
System.out.println("bubbleSort:" +Arrays.toString(nums));//nums= new int[] { 6, 3, 8, 2, 9, 1};
QuickSort(nums,0, nums.length - 1);
System.out.println("QuickSort:" +Arrays.toString(nums));//nums= new int[] { 6, 3, 8, 2, 9, 1};
ChoiceSort(nums);
System.out.println("ChoiceSort:" +Arrays.toString(nums));
}//冒泡排序
public static void bubbleSort(int[] a) {int len =a.length;for (int i = 0; i < len - 1; i++) {for (int j = 0; j < len - 1 - i; j++) {if (a[j] > a[j + 1]) {
swap(a, j+ 1, j);
}
}
}
}//快速排序
public static void QuickSort(int a[], int low, inthight) {inti, j, index;if (low >hight) {return;
}
i=low;
j=hight;
index= a[i]; //用子表的第一个记录做基准
while (i < j) { //从表的两端交替向中间扫描
while (i < j && a[j] >=index)
j--;if (i
a[i++] = a[j];//用比基准小的记录替换低位记录
while (i < j && a[i]
i++;if (i < j) //用比基准大的记录替换高位记录
a[j--] =a[i];
}
a[i]= index;//将基准数值替换回 a[i]
QuickSort(a, low, i - 1); //对低子表进行递归排序
QuickSort(a, i + 1, hight); //对高子表进行递归排序
}//选择排序
public static void ChoiceSort(int[] a) {for (int i = 0; i < a.length; i++) {int min =i;for (int j = i + 1; j < a.length; j++) {if (a[min] >a[j]) {
min=j;
}
}if (i !=min) {int tmp =a[min];
a[min]=a[i];
a[i]=tmp;
}
}
}//交换元素
private static void swap(int[] a, int i, intj) {inttmp;
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}