Java 计数最大连续数1';二进制数中的s
如何在Java中计算二进制数的最大连续1? 例如,用户输入一个类似13的整数,这将是二进制1101。 二进制数1101有两个连续的1,因此输出应该是2。 另一个例子是数字5是二进制0101,因此输出应该是1。如果我输入439号,我的程序就不能正常工作Java 计数最大连续数1';二进制数中的s,java,Java,如何在Java中计算二进制数的最大连续1? 例如,用户输入一个类似13的整数,这将是二进制1101。 二进制数1101有两个连续的1,因此输出应该是2。 另一个例子是数字5是二进制0101,因此输出应该是1。如果我输入439号,我的程序就不能正常工作 Scanner scanner = new Scanner(System.in); int numb = scanner.nextInt(); int tempCount = 0; int count
Scanner scanner = new Scanner(System.in);
int numb = scanner.nextInt();
int tempCount = 0;
int count = 0;
// numb = 439 -> output 3
// numb = 13 -> output 2
// numb = 1 -> output 1
while (numb >= 1) {
if (numb % 2 != 0) {
tempCount++;
numb /= 2;
count = tempCount;
if (numb % 2 != 0) {
tempCount++;
count = tempCount;
numb /= 2;
}
}
else {
numb /= 2;
tempCount = 0;
}
}
System.out.println(count);
我想出来了,这是解决办法。 我忘记了嵌套的if语句
Scanner scanner = new Scanner(System.in);
int numb = scanner.nextInt();
int tempCount = 0; //save temporarily the longest sequence of one's in this variable
int count = 0; // before the sequence of one's gets interrupted, I save the value from tempCount in count
// numb = 439 -> output 3
// numb = 13 -> output 2
// numb = 1 -> output 1
while (numb >= 1) {
if (numb % 2 != 0) {
tempCount++;
numb /= 2;
if(count < tempCount){
count = tempCount;
}
}
else {
numb /= 2;
tempCount = 0;
}
}
System.out.println(count);
Scanner Scanner=新的扫描仪(System.in);
int numb=scanner.nextInt();
int tempCount=0//暂时保存此变量中的最长序列
整数计数=0;//在一个人的序列被中断之前,我将tempCount中的值保存在count中
//numb=439->输出3
//numb=13->输出2
//numb=1->输出1
while(numb>=1){
如果(编号%2!=0){
tempCount++;
麻木/=2;
如果(计数<临时计数){
计数=临时计数;
}
}
否则{
麻木/=2;
tempCount=0;
}
}
系统输出打印项次(计数);
我们可以在最不重要的位置识别两个连续的二进制位,如下所示:
(value & 0b11) == 0b11
我们可以将值中的位向右移动,如下所示:
value >>>= 1;
使用tripple>>
而不是double>
非常重要,因为我们不关心符号位
然后我们所要做的就是跟踪连续1
s的最大数量:
int countMax1Streak(int value) { // value could also be a long if required
int max = 0;
int count = 1;
while (value != 0) {
if ((value & 0b11) == 0b11) {
count++;
} else {
count = 1;
}
value >>>= 1;
if (count > max) {
max = count;
}
}
return max;
}
测试用例:
assertEquals(0, countMax1Streak(0b0));
assertEquals(1, countMax1Streak(0b1));
assertEquals(1, countMax1Streak(0b10));
assertEquals(2, countMax1Streak(0b11));
assertEquals(3, countMax1Streak(0b1110011));
assertEquals(3, countMax1Streak(0b1100111));
assertEquals(3, countMax1Streak(0b1110111));
assertEquals(7, countMax1Streak(0b1111111));
assertEquals(32, countMax1Streak(-1));
您还可以使用来计算最大0条纹,如下所示:
public int countMax0Streak(int value) {
return countMax1Streak(~value);
}
我相信您希望
count
是最长的1s序列的长度,而tempCount
是您当前计数序列中的1s数。因此,仅当tempCount
大于count
时,才应将tempCount
指定给count
。对于439,我相信您正确地计算了3个1。然后是0,您正确地将tempCount
重置为零。下次计算1时,正确地将tempCount
增加到1,然后将此值也分配到count
,则三的计数将丢失。这是一个有趣的问题。这是一个通用的解决方案,它还考虑了Java中所有可能的long
值(如果您检查n
的值,您的解决方案可能不适用于负数):
请注意,可以根据number和bit的值进行一些优化,但对于初学者来说,这应该是一个不错的解决方案。您必须实现自己的十进制->二进制方法吗?如果不是,你可以使用Integer.toBinaryString()不,我只需要取一个整数,然后输出二进制版本中有多少个连续的整数。
1110111
的结果应该是什么?3或6?对于二进制数1110111,在这种情况下,结果应3重新打开,与其他问题不同。您的测试用例显示,要计算相反类型的位,您所需要做的只是不计算输入,因此参数b
是多余的。这与我的答案非常接近,但请注意,我不需要知道输入中的位数。
public class LongestBitStreak {
/**
* Returns the longest <i>streak</i> of the given bit b in
given number n.
* A bit streak is defined as a consecutive sequence of the given bit.
* @param n the number to find streak in
* @param b the bit whose streak is to be found
* @return the <i>longest</i> bit streak
*/
static int get(long n, int b) {
if (b != 0 && b != 1)
throw new IllegalArgumentException("second arg: (" + b + ") must be 0 or 1");
int streak = 0, maxStreak = 0;
for (int i = 0; i < 64; i++) {
if ((n & 1) == b) {
streak += 1;
maxStreak = Math.max(streak, maxStreak);
} else {
streak = 0;
}
n >>= 1;
}
return maxStreak;
}
@Test
public void foolProof() {
long n = 0b11111000001111100110101010;
long nc = ~n; // One's complement of n
System.out.println(get(n, 1));
System.out.println(get(nc, 0));
assertEquals(get(n, 1), get(nc, 0));
assertEquals(get(n, 0), get(nc, 1));
}