玩玩算法入门题,下面是问题
给你一个整数数组 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