这几天的简单记录其实大部分还是在我代码里面,这是只是一些简单的记录
位运算
$ | ^ ~
<<和>>和>>>(补0)
对于int ,有1<<35(取模后变3)与1<<3相同,long就是按64取模
位运算可以实现没有第三个值的情况下,交换两个数
A00110011
B10101111
B10011100
A10101111
原理 ABA = B
https://blog.youkuaiyun.com/u013412497/article/details/44475873
A^A=000…
异或还可以看错不进位加法
1.位运算题目1
那个原理的妙用 可用来处理 1001个数字中包括1-1000,还有一个是1-1000中的一个数字,重复 求那个重复的是数字是多少
arr[1001] 轮流异或 再 异或一次1-100 轮流异或
ABB(重复的)CDEF ^ ABCDE^F == B
A是成对存在的,BBB是三个 BBB =B
巧妙地补成一对一对
这道题的另一种解法,如果可以开辟空间的话,那就考虑数字下标的妙用,开辟一个1000的空间,1就表示重复数组中1出现的个数,遍历一次,如果遇到++
遍历第二次就在那新开的1000个空间中找一个2(其他都是1)
讲N转为二进制
2.位运算题目2
判断二进制1的个数
package com.offer;
public class NumberOf1 {
//这是初级版本
public static int NumberOf1(int n) {
int x = 1;
int count = 0;
for (int i = 0; i < 32; i++) {
if ((x&n) != 0) {
count++;
}
x = x<<1;
}
return count;
}
//升级版本的解法
//把一个是数字-1都是把原来那个数字的最右边的1变成0
//基于上面这句话再让 原来那个数字与他减去一之后的数字做与运算,得到的结果就是
//最左边的1变0,其他数字不变
public static int NumberOf12(int n) {
int count = 0;
while (n!=0) {
n = n & (n - 1);
count++;
}
return count;
}
public static void main(String[] args) {
System.out.println(NumberOf12(7));
}
}
3.递归与循环
解决递归问题的两个要点:
1.发现逻辑的相关性!!
2.找出递归的出口
3.委托机制,踢皮球,自己干一点,下面的交给别人去搞
发现相似性
1.摸索重复的规律,如果找不到
2.可以参数去构造相关性
没困难-》自找可能,再解决
递归其实计算机是不知道的,只是它调用的方法刚好就是本身
基于一种保存断点的形式执行
(也可以说是压栈 谈栈)
package com.offer;
public class AddALL {
public static void main(String[] args) {
int[] a = {7,6,7,3,100,1,7,8,6,4};
//int sum = addAll(a,0);//从头来
//int sum = addAll2(a, a.length-1);//从尾巴来
int sum = addAll3(a, 0,a.length-1);//从尾巴来
System.out.println(sum);
}
/**
* @Description : 实现递归累加
* @Param: [a]:要累加的数组 begin:
* @Return: int:累加值
* @Author: WYF
* @Date: 2020/1/12 11:26
*/
private static int addAll(int[] a,int begin) {
//问题核心:传入的数组a压根没变,怎么搞
//踢皮球【.自己加[.....给别人去加]】
//要多加一个参数
if (begin >= a.length) {
return 0;
}
return a[begin] + addAll(a,begin+1);
}
/**
* @Description:
* @Param: [a, end] a是要累加的数组,end是结束位置
* @Return: int
* @Author: WYF
* @Date: 2020/1/12 12:36
*/
private static int addAll2(int[] a,int end) {
//问题核心:传入的数组a压根没变,怎么搞
//踢皮球【[.....给别人去加].自己加】
//要多加一个参数
if (end < 0) {
return 0;
}
return a[end] + addAll2(a,end-1);
}
/**
* @Description: 折半式累加
* @Param: [a:累加的数组, begin:起始位置, end:结束位置]
* @Return: int
* @Author: WYF
* @Date: 2020/1/12 13:10
*/
private static int addAll3(int[] a,int begin,int end) {
//问题核心:传入的数组a压根没变,怎么搞?加参数呗
//踢皮球【[.....给别人去加].自己加[.....给别人去加]】
//要多加2个参数
if (begin==end) {
return a[begin];
}else if (end-begin==1){
return a[end]+a[begin];
}
int mid = (begin + end) / 2;
return addAll3(a,begin,mid-1) + a[mid] + addAll3(a,mid+1,end);
}
}
做递归问题的步骤:
我们自己做一部分,剩下的交给别人去做
4.几个常用的函数
记录几个有用的函数,写算法可能用到
int index = new Random().nextInt(N);
[0,N)
产生随机数
String str1 = “A,B,C,D”;
String[] arr1 = str1.split(",");
System.out.println(Arrays.toString(arr1));
字符串分割成数组
int N = Integer.toString(N, 2)
2换16就是16进制
进驻转换
int i = Integer.parseInt(s1);
string转数字