学习 算法 个人简单笔记

5 篇文章 0 订阅
4 篇文章 0 订阅

这几天的简单记录其实大部分还是在我代码里面,这是只是一些简单的记录

位运算

$ | ^ ~

<<和>>和>>>(补0)

对于int ,有1<<35(取模后变3)与1<<3相同,long就是按64取模

位运算可以实现没有第三个值的情况下,交换两个数

A00110011

B10101111

B10011100

A10101111

原理 ABA = B

https://blog.csdn.net/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转数字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值