算法基础二之二分法与异或运算,java面试宝典电子版

在一个有序数组中,找>=某个数的最左侧的位置


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开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。

整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-ZzWf0oLf-1710430777957)]
[外链图片转存中…(img-n8V9XMZz-1710430777957)]
[外链图片转存中…(img-5yAYkbJg-1710430777958)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-67LcEpSY-1710430777958)]

最后

文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值