leetcode 面试题05.04.下一个数

    技术2023-06-15  93

    原题

    面试题05.04.下一个数

    题解

    方法一 暴力法(代码通过但是很多手输实例超时)

    本方法就是从给定的数字num两侧分别开始找比特数域num相同的数,每一边找到就立刻停止寻找。 本思路java代码示例:

    /* 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:36.8 MB, 在所有 Java 提交中击败了100.00%的用户 2020.07.02 14:19 */ class Solution { public int[] findClosedNumbers(int num) { int bit=Integer.bitCount(num); int da=-1; int xiao=-1; for(int i=num+1;i<=Integer.MAX_VALUE;i++){ if(Integer.bitCount(i)==bit){ da=(int)i; break; } } for(int i=num-1;i>0;i--){ if(Integer.bitCount(i)==bit){ xiao=(int)i; break; } } return new int[]{da,xiao}; } }

    方法二 筛选(仍有个别测试例超时)

    /* @v7fgg 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:37.1 MB, 在所有 Java 提交中击败了100.00%的用户 2020年7月3日 10:31 */ class Solution { public int[] findClosedNumbers(int num) { int da=-1; int xiao=-1; int bit=Integer.bitCount(num); if(!meida(num)){ for(int i=num+1;i>0;i++){ if(bit==Integer.bitCount(i)){ da=i; break; } } } if(!meixiao(num)){ for(int i=num-1;i>0;i--){ if(bit==Integer.bitCount(i)){ xiao=i; break; } } } return new int[]{da,xiao}; } public boolean meida(int num){ int zuida=0; int i=1073741824; int j=1; while(i>0){ zuida+=j; zuida*=i; if(num==zuida){return true;} zuida/=i; i/=2; j*=2; } return false; } public boolean meixiao(int num){ int zuixiao=0; int i=1; while(zuixiao<=1073741824){ zuixiao+=i; if(num==zuixiao){return true;} i*=2; } return false; } } //测试例:1879048191 答案[2013265919,1610612735] 耗时:1819 ms //测试例:1073741822 答案[1342177279,1073741821] 耗时:1328 ms //测试例:536870911 答案[805306367,-1] 耗时:1397 ms //测试例:1073741823 超时
    Processed: 0.024, SQL: 9