Java 我想知道这是否是一个很好的编程实践,否则我如何才能编写出更优化、更高效的程序

Java 我想知道这是否是一个很好的编程实践,否则我如何才能编写出更优化、更高效的程序,java,algorithm,logic,Java,Algorithm,Logic,我想写一个将十进制转换为二进制的程序,然后在其中查找连续的1的数目,而不使用Integer.toBinary()等函数。 我的节目: public class Practise { static String decimalToBinary(int num) { String binaryN = ""; while (true) { binaryN += num % 2; num = num / 2; if (num == 1)

我想写一个将十进制转换为二进制的程序,然后在其中查找连续的1的数目,而不使用Integer.toBinary()等函数。 我的节目:

public class Practise {

static String decimalToBinary(int num) {
    String binaryN = "";
    while (true) {
        binaryN += num % 2;
        num = num / 2;

        if (num == 1) {
            binaryN += 1;
            break;
        }
    }
    String nBinary = "";
    for (int i = binaryN.length() - 1; i >= 0; i--) {
        nBinary += binaryN.charAt(i);
    }
    System.out.println(nBinary);
    return nBinary;
}

static int consecutiveOnes(String binaryN) {
    int consecutive = 0;
    int max = 0;
    boolean isFreshStart = false;
    for (int i = 0; i < binaryN.length(); i++) {

        if (binaryN.charAt(i) == '1') {
            if (isFreshStart) {
                consecutive = 1;
                isFreshStart = false;
            } else
                consecutive++;

        } else {
            isFreshStart = true;

        }
        if (consecutive > max)
            max = consecutive;
    }
    return max;
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    String binaryN = decimalToBinary(n);
    System.out.println(consecutiveOnes(binaryN));
}

}
公共课堂练习{
静态字符串十进制(int num){
字符串binaryN=“”;
while(true){
binaryN+=num%2;
num=num/2;
如果(num==1){
binaryN+=1;
打破
}
}
字符串nBinary=“”;
对于(int i=binaryN.length()-1;i>=0;i--){
nBinary+=binaryN.charAt(i);
}
系统输出打印(n二进制);
二次返回;
}
静态int连续数(字符串二进制数){
int=0;
int max=0;
布尔值isFreshStart=false;
对于(int i=0;i最大值)
最大值=连续;
}
返回最大值;
}
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
int n=in.nextInt();
字符串二进制数n=十进制二进制数(n);
System.out.println(连续数(二进制数));
}
}

如果我的程序不是最佳的,那么如果不是最佳的,怎么可能更好呢?提前谢谢。

如果你的目标是连续计算1, 那么最好不要转换成二进制字符串

您可以使用位移位对位进行迭代:

int work = num;
while (work > 0) {
    int bit = work & 1;
    work >>= 1;
    // Todo: count consecutive 1s
}

这种方法将使用更少的存储空间(基本上是单个
int
而不是
字符串
),并且工作速度更快,无需创建额外的对象和不必要的中间类型转换。

如果您的目标是计算连续的1, 那么最好不要转换成二进制字符串

您可以使用位移位对位进行迭代:

int work = num;
while (work > 0) {
    int bit = work & 1;
    work >>= 1;
    // Todo: count consecutive 1s
}

这种方法将使用更少的存储空间(本质上是一个
int
而不是
字符串
),并且在不创建额外对象和不必要的中间类型转换的情况下工作得更快。

看起来正常,但循环不会因
num看起来正常而终止,但是循环不会因为
num而终止,谢谢你从中学到了很多答案,但是你能检查我的连续计数1的方法是否是最优的吗。@Adibrajiwate我的观点是不,它不是最优的。但是如果我只看将位作为字符串的连续数,那么仅此方法的实现在性能方面是可以的,但是它可以用一种更简单易读的方式编写:您可以删除标志变量
isFreshStart
,并减少一些条件。感谢您从中学到了很多答案,但您能否检查我的连续计数1的方法是否是最佳的。@Adibrajiwate我的观点是不,它不是最佳的。但是如果我只看将位作为字符串的
连续数
,那么仅此方法的实现在性能方面是可以的,但是它可以用一种更简单的方式编写,更易于阅读:您可以删除标志变量
isFreshStart
,并减少一些条件。