一、查找:
二分查找(binarySearch):要求数组已经是排好序的。(例子从小到大排好序),在数组中找出key值的索引。
// 方法一:非递归实现(while循环)
public static int binarySearch1(int[] arr, int key) {
int low = 0; // 起始索引
int high = arr.length - 1; //末尾索引
while (low <= high) {
int mid = (low + high) / 2; //二分索引
if (key == arr[mid]) { // 找到目标数
return mid;
} else if (key < arr[mid]) { // 目标数在左边
high = mid - 1;
} else { // 目标数在右边
low = mid + 1;
}
}
return -1; // 没找找目标数
}
// 方法二:递归实现
public static int binarySearch2(int[] arr, int key, int low, int high) {
int mid = (low + high) / 2; // 中间索引
if (key < arr[low] || key > arr[high] || low > high) {
return -1;
}
if (key == arr[mid]) { // 找到目标数
return mid;
} else if (key < arr[mid]) { // 目标数在左边
return binarySearch2(arr, key, low, mid - 1);
} else { // 目标数在右边
return binarySearch2(arr, key, mid + 1, high);
}
}
二、排序:
1、冒泡排序:每趟进行两两比较,每次最小数往上冒泡。
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 temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
2、快速排序:选基值,分左右,递归排。
3、插入排序:设哨兵,插最小。
public static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {// 外层循环次数
int key = arr[i]; // 设置哨兵
while (i > 0 && key < arr[i - 1]) { // 遇到前面较大的数,插入该位置
arr[i] = arr[i - 1];
i--;
}
arr[i] = key; // 取出数
}
for (int i = 0; i < arr.length; i++) { // 遍历数组
System.out.print(arr[i] + " ");
}
}
三、数的判断:
1、奇数:n/2 != 0;
2、偶数:n/2 == 0;
3、素数:
for(int i=2;i<n;i++){ //在2到n-1区间内没有余数
if(n/i==0){
return false;
}
return true;
}
4、回文数:(等于字符串的反转)
String s = x+""; //整型转变为字符串类型
Char[] c = s.toCharArray(); //字符串类型转变为字符数组
for(int i=0; int j=c.length-1; i<c.length/2; i++; j--){
if(c[i] != c[j]){
return false;
}
}
5、水仙花数:
ge = n%10; shi = n/10%10; bai = n/100%10;
if(n == ge*ge*ge + shi*shi*shi + bai*bai*bai ){
return true;
}
四、递归:
1、n 的阶乘:(n>0)
int f(n){
if(n==1) return 1;
if(n>1) return n*f(n-1);
}
2、x 的n次幂
int f(x,n){
if(x==0) return 0;
else{
if(n==0) return 1;
else if(n==1) return x;
else return x*f(x,n-1);
}
}
五、打印类:
1、九九乘法表:
for(int i=1; i<10; i++){
for(int j=1; j<10; j++){
System.out.print(i*j+ " ");
}
}
2、星型打印:
for(int i=1; i<line; i++){//控制行数
for(int j=1; j<=line-i; j++){//控制每行的空格数
System.out.print(" ");
}
for(int z=1; z<=2i-1; z++){//控制每行的星数
System.out.print("*");
}
}
3、杨辉三角:
int[][] arr = new int[n][n];
for (int i = 0; i < arr.length; i++) { // 第一行和最后一行都为1
arr[i][0] = 1;
arr[i][i] = 1;
}
for (int i = 1; i < arr.length; i++) {// 其余行的填充
for (int j = 1; j < arr.length - 1; j++) {
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
for (int i = 0; i < arr.length; i++) { // 遍历二维数组
for (int j = 0; j <= i; j++) { // 过滤默认填充的0
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
六、while循环求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。
public static int aaSum(int a, int n) {
int aaSum = 0;
int i = 1;
while (i <= n) {
aaSum += a;
a = (a * 10) + a;
i++;
}
return aaSum;
}
七、实现字符串反转:
1、类StringBuffer实现:
new StringBuffer.reverse(str).reverse().toString();
2、数组实现:
char[] c = s.toCharArray(); // 创建字符数组
StringBuilder ss = new StringBuilder(); // 创建StringBuilder对象
for (int i = c.length - 1; i >= 0; i--) {
ss.append(c[i]); // 调用StringBuilder对象的append方法
}
return ss.toString(); // 返回字符串类型