Leetcode面T5(1-9)树(1)

  • 使得M从N的第j位开始,到第i位结束,假定从j位到i位足以容纳M,也即是M=10011

  • 那么j和i之间至少可以容纳5个数,假如,不可能出现j=3,i=2的情况,因为第三位和第二位之间放不下M

  • 例如

  • N=1000000000(1024)

  • M=10011(19)

  • i=2,j=6,输出10001001100

  • 思路如下:

  • 1.将N中的从j到i之间清零

  • 2.对M执行移位操作与j和i之间的位对其

  • 3.合并M和N

  • */

public int updateBits(int n,int m,int i,int j)

{

int allOnes=~0;//创建一连串1 假如为11111111

int left=allOnes<<(j+1); //在位置j之前的位均值为1,其余为0,此刻为11100000

int right=((allOnes<<i)-1);//在位置i之后的位均置位1,此刻为00000011

int mask=left | right; //进行位或运算之后得到 11100011

int n_cleared=n& mask; //清除位置j到i的位,然后将M放进去

int m_shifted=m<<i; //将M移动到相应的位置

return n_cleared | m_shifted; //对两者进行位或操作

}

public static void main(String[] args) {

// TODO Auto-generated method stub

BitGet bg = new BitGet();

int num=bg.updateBits(1024, 19, 2, 6);

System.out.println(Integer.toBinaryString(num));

}

Q5.2 二进制数转字符串

二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。

示例1:

输入:0.625

输出:“0.101”

示例2:

输入:0.1

输出:“ERROR”

提示:0.1无法被二进制准确表示

提示:

32位包括输出中的"0."这两位。

  • 浮点数乘以进制2,取整数位添加到 二进制小数位后面

  • 浮点数舍去整数位,重复以上过程直至浮点数变成 0,若无法等于 0,则无法精确表示

另参考:二进制小数 转 10进制

举例:将 二进制0.1111转换成 十进制数

二进制            0               .               1                     1                  1                   1

----------------------------------------------------------------------------------------------------------------

换算次方        2^(0)                     2^(-1)             2^(-2)             2^(-3)           2^(-4)

----------------------------------------------------------------------------------------------------------------

换成分数         0/2                        1/2                 1/4                 1/8               1/16

----------------------------------------------------------------------------------------------------------------

换成十进制      0         +                0.5        +       0.25        +     0.125     +   0.0625    =   0.9375

class Solution {

public String printBin(double num) {

StringBuilder builder = new StringBuilder(“0.”);

for (int i = 0; i < 33; i++) {

num *= 2;

if (num >= 1) {

// 取整数部分

builder.append(“1”);

// 取完后减1取小数部分

num -= 1;

} else {

builder.append(0);

}

if (num == 0) {

return builder.toString();

}

}

return “ERROR”;

}

}

Q5.3 翻转数位

示例 1:

输入: num = 1775(11011101111)

输出: 8

示例 2:

输入: num = 7(0111)

输出: 4

Java简单迭代:

curLen记录当前长度,

preLen记录上次翻转后的长度,

因为只能翻转1次,所以需要再次翻转时curLen要减去preLen。

class Solution {

public int reverseBits(int num) {

int maxLen = 0, preLen = 0, curLen = 0, bits = 32;

while (bits-- > 0) {

if ((num & 1) == 0) {

curLen -= preLen;

preLen = curLen + 1;

}

curLen++;

maxLen = Math.max(maxLen, curLen);

num >>= 1;

}

return maxLen;

}

}

Q5.4 下一个数

下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。

示例1:

输入:num = 2(或者0b10)

输出:[4, 1] 或者([0b100, 0b1])

示例2:

输入:num = 1

输出:[2, -1]

提示:

num的范围在[1, 2147483647]之间;

如果找不到前一个或者后一个满足条件的正数,那么输出 -1。

手写下一个排列、前一个排列

public int[] findClosedNumbers(int num) {

int up = num + 1;//向上枚举

int down = num - 1;//向下枚举

int count = findOneCount(num);//num的1的个数

while (findOneCount(up) != count) {

up++;

if (up < 0) {//越界了那就是找不到,设置为-1

up = -1;

break;

}

}

while (findOneCount(down) != count) {

down–;

if (down < 0) {//变为负数了那就是找不到了,设置为-1

down = -1;

break;

}

}

return new int[]{up, down};

}

//求数的二进制1的个数

private static int findOneCount(int num) {

int count = 0;

最后

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2020-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,这里我也免费分享给大家也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一起互勉~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

来学习,也可以分享给身边好友一起学习。

[外链图片转存中…(img-jOOADgFa-1714507933158)]

[外链图片转存中…(img-fisHHQ8w-1714507933159)]

一起互勉~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值