2的幂?代码有什么问题

时间:2018-07-09 11:57:54

标签: java list

如果给定的no为2的幂,则将1加到列表中;如果不是2的幂,则将0加到列表中。 如果给定的输入列表是[2,3,4]-> [1,0,1]应该是结果,但是我得到[1,0,1,1]为什么呢?

这是我的代码

public class HelloWorld{
    public static void main(String []args){
        List<Integer> l=new ArrayList();
        l.add(2);
        l.add(3);
        l.add(4);


        List<Integer> l1=new ArrayList();

        for(int i=0;i<l.size();i++){
            if(l.get(i)==0)
                l1.add(0);

            int n=l.get(i);

            while(n!=1){
                if(n%2!=0){
                    l1.add(0);
                }
                n=n/2;
            }
            l1.add(1);

        }
        System.out.println(l1);
    }

1 个答案:

答案 0 :(得分:0)

您的代码在第3位细分,看看会发生什么:

                        // first iteration                     second iteration
while(n!=1){            // 3 is not 1                          n is 1, so stop
    if(n%2!=0){         // 3%2 is 1, so it is not 0
        l1.add(0);      // you add 0 to the list
    }
    n=n/2;              // 3/2 is 1
}
l1.add(1);              //                                     after the loop, add 1

如果您已经为数字添加了0,则您不想添加1。您应该确保只为旧列表中的每个号码添加一个号码到新列表中。

首先,您可能会注意到Javac抱怨您使用的是未经检查或不安全的操作。那是因为您只在一侧使用<>菱形运算符。将它们也添加到右侧,以确保编译器知道哪些对象可以进入列表。

while(n!=1){            // As long as n is not 1
    if (n%2!=0){        // if n%2 is not 0 (it is 1) and we can
        l1.add(0);      //  set 0
    }
    if (n==2){          // if n is 2, it is a power of 2 and we can
        l1.add(1);      //  set 1
    }
    n=n/2;              // if n is neither 1, nor 2, we need to keep dividing
}

您应该做的是,如果n为2,则仅将1加到列表中,因为这样您就可以确定要处理的数字是2的幂。

希望这很清楚,因为下一步将修复列表元素为0时的代码,因为此刻,这将导致无限循环。祝你好运!