/* Next Number: Given a positive integer, print the next smallest and the last largest number that have the same number of 1 bits in their binary representation. 方法是:1:最小下一个:11011001111100 相同数量的1的情况下 一定是从后往前数第一个0 变成1 再把后面的全变成0,最后从最后以为开始把缺的1的数量补齐 11011010000000 p 11011010001111 要完成这个步骤 首先要建立一个mask 用于过滤掉位置之后的字符 第一步全变0 之后再把1填进去 */ public class Main { public static void main(String[] args) { System.out.println("Hello World!"); int bit = 13948; System.out.println(Integer.toBinaryString(bit)); int next = findNext(bit); System.out.println(Integer.toBinaryString(next)); int last = findLast(bit); System.out.println(Integer.toBinaryString(last)); } //先找到位置p 找p的方法是从右往左一次位移 如果是0 则 numOfZero+1;是1则numOfOne+1;一直到1前面第一个0的位置 而p则是0的个数加上1的个数; public static int findNext(int bit) { int temp = bit; int numOfZero = 0, numOfOne = 0; while(temp != 0 && (temp & 1) == 0) { numOfZero++; temp = temp >> 1; } while(temp != 0 && (temp & 1) == 1) { numOfOne++; temp >>= 1; } int p = numOfOne + numOfZero; int mask = ~((1 << p) - 1); bit |= (1 << p); bit &= mask; bit |= ((1 << (numOfOne - 1)) - 1); return bit; } //找上一个最大的时候,反过来思考就行 找到0前面的第一个1,p的位置就是这里,同样找到0的个数和1的个数,把配置的1变成0之后 再把后面的位置清0 //最后填1 1是从配位置开始往后填写; public static int findLast(int bit) { int temp = bit; int numOfZero = 0, numOfOne = 0; while(temp != 0 && (temp & 1) == 1) { numOfOne++; temp >>= 1; } while(temp != 0 && (temp & 1) == 0) { numOfZero++; temp >>= 1; } int p = numOfOne + numOfZero; int mask = ~((1 << (p + 1)) - 1); bit &= mask; bit |= ((1 << p) - 1); bit &= ~((1 << (numOfZero - 1)) - 1); return bit; } }
Next Number java 走地牙CTCI 5.4
最新推荐文章于 2019-04-14 03:48:06 发布
这是一个关于Java编程的问题,目标是找到一个正整数的下一个最小和最大整数,这两个整数在二进制表示中具有相同数量的1位。方法包括找到第一个0的位置(对于最小值)或最后一个1的位置(对于最大值),然后根据特定规则调整二进制表示。代码中提供了findNext和findLast两个函数分别实现这一过程。
摘要由CSDN通过智能技术生成