1.实现二分法查找算法:有序的数组 找到返回下标,没有返回-1
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入插入的元素个数:");
int n = scanner.nextInt();
int[] arr = new int[n];
//放置数组里的元素
System.out.println("请输入有序的元素:");
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
System.out.println("输入你想查询的数字key:");
int key = scanner.nextInt();//输入要查询的数
int indexNum = binarySearch(arr, key);
System.out.println("与key相等的元素下表为:" + indexNum);
}
static int binarySearch(int[] arr, int a) {
int low = 0;//代表索引
int high = arr.length - 1;
int count = 1;//计数
while (low <= high) {
System.out.println("第" + count + "次二分查找范围" + low + "---------------" + high);
int mid = (low + high) / 2;
if (arr[mid] == a) {
return mid;
} else if (arr[mid] > a) {
high = mid - 1 ;//如果单纯为 high = mid,low = mid,查找最后一个数会陷入无限循环
} else {
low = mid + 1;
}
count++;
}
return -1;
}
}
2.求连续子数组的最大和
private static long getMax(long a, long b) {
return a > b ? a : b;
}
public static Long getMax(int[] array) {
if (array == null || array.length <= 0) {
return null;
}
long maxSum = array[0]; //所有子数组中最大的和
long righteEdge = array[0]; //右侧子数组的最大和
for (int i = 1; i < array.length; i++) {
//当右侧子数组的最大和为负数时,对于新数组,右侧子数组的最大和为新增加的数。
if (righteEdge < 0) {
righteEdge = array[i];
} else { //为正数时,对于新数组,右侧子数组的最大和为新增加的数 + 原来的最大和。
righteEdge += array[i];
}
//所有子数组中最大的和
System.out.println("righteEdge-------------maxSum:"+righteEdge+"****************"+maxSum);
maxSum = getMax(righteEdge, maxSum);
}
return maxSum;
}
public static void main(String[] args) {
int[] array = {1, -2, 3, 10, -4, 7, 2, -5};
//int arr[] = {4,-3,5,-2,-1,2,6,-2};
System.out.println("Max sum: " + MaxSubArraySum.getMax(array));
}
}
3.交换两个数
public static void main(String[]args)
{
int x =10,y=20; //定义两个变量
System.out.println("x="+y+"y="+x); //直接在输出的时候交换
}
}
//方法一:最简单的直接输出
public static void swap1(int a1, int b1){
int temp;
temp = a1;
a1 = b1;
b1 = temp;
System.out.println("a1" + " = " + a1 + "; " + "b1" + " = " + b1 + '\n');
}
//方法二:引入第三个数
public static void swap2(int a2, int b2){
a2 = a2 + b2;//30
b2 = a2 - b2;//10
a2 = a2 - b2;//20
System.out.println("a2" + " = " + a2 + "; " + "b2" + " = " + b2 + '\n');
}
//方法三:加减运算
public static void swap3(int a3, int b3){
a3 = a3^b3;//30
b3 = a3^b3;//10
a3 = a3^b3;//20
System.out.println("a3" + " = " + a3 + "; " + "b3" + " = " + b3);
}
public static void main(String[] args) {
swap1(10, 20);
swap2(10, 20);
swap3(10, 20);
}
}
//方法四;erjinzhi异或运算
4.逆置数组 {1,2,3,4}==>{4,3,2,1}
{
public static void main(String[] args)
{
int m=1/2;//==0
int[] arr={1,5,6,8,9,4,3};
//只要把数组中的前一半元素和后面的元素交换位置就可以了.
//要循环几次是根据数组的长度来确定的.
//数组长1,循环0次 1/2
//数组长2,循环1次 2/2
//数组长3,循环1次 3/2
//数组长4,循环2次 4/2
//数组长5,循环2次 5/2
//循环次数总结规律:数组长度/2
//交换位置:数组长度是7
//i 7-i-1
//0 6
//1 5
//2 4
for(int i=0;i<(arr.length)/2;i++)
{ //把数组的值赋给一个临时变量
int temp=arr[i];
//把后面的值赋给前面的
arr[i]=arr[arr.length-i-1];
//把获取的临时变量赋给后面的
arr[arr.length-i-1]=temp;
}
for(int i=0;i<arr.length;i++)
{
System.out.println(arr[i]);
}
}
}