我在努力解决HackerRank代码10日问题。
简而言之,任务是在一个十进制数的二进制表示中找到连续1的最大数目。在我的代码中,我尝试使用两个变量:count和hold。当字符串的当前位置和前一个位置都是1时,count增加1。当I‘’th位置为0时,count的值被赋值给变量hold。在接下来的迭代中,如果count的值超过hold的值,则count的值被分配给hold。这样,连续1的最大值存储在hold中。最后,我打印hold的值。
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Enter decimal number");
int n = in.nextInt();
String binary = Integer.toString(n,2);
int count=1;
int hold=0;
if(binary.equals("0"))
System.out.println(0);
else
{
for(int i=0;i<binary.length();i++)
{
if(i==0){}
else if(binary.charAt(i-1)=='1' && binary.charAt(i)=='1')
{
count++;
}
if(count>hold)
hold=count;
if(binary.charAt(i)=='0')
{
hold=count;
count=1;
}
}
System.out.println(hold);
}
}
}我的代码不适用于示例输入"524275“,该输入以二进制格式转换为"1111111111111110011”。输出结果是2,这是奇怪的。我的代码是这样写的,以返回连续1的“最大”数目。我哪里出错了?我试着从精神上运行代码,但还没有发现错误。
发布于 2017-07-23 17:02:31
在使用for循环处理了第一个15之后,hold实际上将具有15值。然后遇到第一个零,if(binary.charAt(i)=='0') { hold=count; count=1; }会将count重置为1。但是,您会立即找到另一个零,相同的代码if(binary.charAt(i)=='0') { hold=count; count=1; }将1存储在hold中,您就会丢失信息15。
一个简单的解决方案就是删除该行中的hold=count;行。您已经在上面设置了三行hold。(而且是正确的,因为只有当count大于以前的最佳值时才会这样做。
这个方法相当复杂。如果你想要一个更简单的方法。代码应该很清楚。
int current_consecutive_ones = 0;
int best_consecutive_ones = 0;
for(int i = 0; i < binary.length(); i++)
{
if (binary.charAt(i) == '1')
current_consecutive_ones++;
else
current_consecutive_ones = 0;
if (current_consecutive_ones > best_consecutive_ones)
best_consecutive_ones = current_consecutive_ones;
}
System.out.println(best_consecutive_ones);https://stackoverflow.com/questions/45267530
复制相似问题