通过万岁!!!
- 题目:一共会给四个数,分别是N、M、i、j,然后希望我们把N和M抓怒换为2进制以后,将M的二进制放在i到j之间的区域,如果M的二进制长度小于i-j+1,则前面补0即可。最后输出转换后的十进制数字。
- 思路1:最简单的思路当然是直接按照题目要求,将N和M转换为二进制,进行处理,然后再转换为十进制。这里需要用到两个api,一个是Integer.toBinaryString(N),用来将int转换为二进制的string;第二个是Integer.parseInt(binaryString, 2),用来将二进制string转换为10进制。剩下的就比较简单了,不过这两个api我也是第一次用到。所以我的第一反应是我的思路2。
- 思路2:我们假设i等于0,可以发现,这个题目其实就是让N的后j-i=j位变成0,然后再加上M即可,也就是说,N-des+M。那如果i不等于0,也就是这里需要多一个步骤,就是des和M后面都要往右边移动i位。那就变成了N+(M-des)*2i。到此,我们的问题关键就是找des了。这就简单了,des初始值为0,我们先将N/(2i)得到tmp,然后通过for循环找到tmp的后j-i+1位的数字就好了。
- 技巧:数学,位运算
class Solution {public int insertBits(int N, int M, int i, int j) {int temp = N / ((int) Math.pow(2, i));int des = 0;for (int k = 0; k < j - i + 1; k++) {des += temp % 2 * (int) Math.pow(2, k);temp = temp / 2;}return N + (M - des) * (int) Math.pow(2, i);}
}
- 总结:题目比较简单,第一个思路需要对api比较熟,第二个思路用到了小学数学。