leetcode算法小基础第一题

玩玩算法入门题,下面是问题

给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。

如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。

请你返回排序后的数组。

这道题是leetcode上很基础的题,我也刚做完,热乎的,上手用吧,我也是才拾起来算法,所以作为第一个题,就记录一下,接下来走流程

分析题目,数组里按二进制1的数目升序,也就排序吗,二进制1就是用元素除以2,一直除,除到除不尽为止,判断每个数有几个1吗就是,这里面有个规律,只要是整数,你除以2,只要你能除以2一直除到取整结果等于0 ,也就结束了,贴一个官方的算法

 public static int  check1(int x) {

        int res = 0;

        while (x != 0) {

            res += x % 2;

            x /= 2;

        }

        return res;

    }

他把取余数放到了循环里,因为不管多少个循环,取到余数就加1没毛病,下面贴我的算法

public static int check(int a,int b){
    if(a==0){
        return b;
    }else if(a==1){
        return b+1;
    }
    if(a%2!=0){
        b++;
        b= check(a/2,b);
    }else if(a/2!=1){
        b= check(a/2,b);
    }else{
        b++;
    }

    return b;
}

其实就是一个十进制到二进制的转换,13=1101,13/2余数是1 就是二进制的末尾的1,然后13就变成了6,6就是末尾以外的数110,6除以2的余数0,就是110的0,6变成了3,3=11,类推下去,算法就有了

我就用递归,也挺有意思的,b初始化都是0,a就是数组元素,反正总结起来我的思路就是,要么除以2等于1结束,中间取余数,很简单,但是作为多年不碰的我,捣鼓起来也弄了一小时

这道题考了一个排序,一个取2,方法很多,欢迎指教,等我有时间再研究别的办法了

 

2020-11-12

记录一个算法

public static int  check(int x) {

        int res = 0;

        while (x != 0) {

         

            res++;

            x^=x&((~x)+1);

        }

        return res;

    }

看看能看懂吗

取反+1其实就是取一个数转化成二进制以后最后一位是1的数,这样与上原数就把最后一位是1的位置0,然后循环下去,一直到==0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值