在一个有序数组中,找>=某个数的最左侧的位置
package com.zh.class001;
import com.zh.util.SortUtil;
import java.util.Arrays;
public class BSNearLeft {
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 10;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr = SortUtil.generateRandomArray(maxSize, maxValue);
Arrays.sort(arr);
int value = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
if (test(arr, value) != nearleftIndex(arr, value)) {
SortUtil.printArray(arr);
System.out.println(value);
System.out.println(test(arr, value));
System.out.println(nearleftIndex(arr, value));
succeed = false;
break;
}
}
System.out.println(succeed ? “Nice!” : “Fucking fucked!”);
}
// 在arr上,找满足>=value的最左位置
public static int nearleftIndex(int[] arr, int value) {
int left = 0;
int right = arr.length - 1;
int index = -1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (arr[mid] >= value) {
index = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return index;
}
// for test
public static int test(int[] arr, int value) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= value) {
return i;
}
}
return -1;
}
}
在一个有序数组中,找<=某个数最右侧的位置
package com.zh.class001;
import com.zh.util.SortUtil;
import java.util.Arrays;
public class BSNearRight {
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 10;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr = SortUtil.generateRandomArray(maxSize, maxValue);
Arrays.sort(arr);
int value = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
if (test(arr, value) != nearRightIndex(arr, value)) {
SortUtil.printArray(arr);
System.out.println(value);
System.out.println(test(arr, value));
System.out.println(nearRightIndex(arr, value));
succeed = false;
break;
}
}
System.out.println(succeed ? “Nice!” : “Fucking fucked!”);
}
// 在arr上,找满足<=value的最右位置
public static int nearRightIndex(int[] arr, int value) {
int left = 0;
int right = arr.length - 1;
int index = -1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (arr[mid] > value) {
right = mid - 1;
} else {
index = mid;
left = mid + 1;
}
}
return index;
}
// for test
public static int test(int[] arr, int value) {
for (int i = arr.length - 1; i >= 0; i–) {
if (arr[i] <= value) {
return i;
}
}
return -1;
}
}
局部最小值问题
条件:无序数组,任意两个相邻的数字都不相等
package com.zh.class001;
/**
-
找出局部最小
*/
public class BSAwesome {
public static int getLessIndex(int[] arr) {
if (arr == null || arr.length == 0) {
return -1; // no exist
}
if (arr.length == 1 || arr[0] < arr[1]) {
return 0;
}
if (arr[arr.length - 1] < arr[arr.length - 2]) {
return arr.length - 1;
}
int left = 1;
int right = arr.length - 2;
int mid = 0;
while (left < right) {
mid = (left + right) / 2;
if (arr[mid] > arr[mid - 1]) {
right = mid - 1;
} else if (arr[mid] > arr[mid + 1]) {
left = mid + 1;
} else {
return mid;
}
}
return left;
}
}
异或运算
====
好记的方法:无进位相加
异或运算的性质:
1)0^N == N N ^ N == 0
2)异或运算满足交换律和结合律
题目一如何不用额外变量交换两个数
a = a ^ b;
b = a ^ b;
a = a ^ b;
public class Test {
public static void main(String[] args) {
int a = 10;
int b = -100;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(“a:” + a);
System.out.println(“b:” + b);
}
}
a:-100
b:10
public class Test {
public static void main(String[] args) {
int[] arr = {3, 1, 100};
swap(arr, 0, 2);
System.out.println(Arrays.toString(arr));
}
public static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
}
[100, 1, 3]
注意:交换可以是相同的值,但是必须是不同的内存区域,否则会变成0
public class Test {
public static void main(String[] args) {
int[] arr = {3, 1, 100};
swap(arr, 0, 0);
System.out.println(Arrays.toString(arr));
}
public static void swap(int a, int b) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(“a:” + a);
System.out.println(“b:” + b);
}
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。
整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-ZzWf0oLf-1710430777957)]
[外链图片转存中…(img-n8V9XMZz-1710430777957)]
[外链图片转存中…(img-5yAYkbJg-1710430777958)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-67LcEpSY-1710430777958)]
最后
文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。