如果给定的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);
}
答案 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时的代码,因为此刻,这将导致无限循环。祝你好运!