DashInsert Coderbyte挑战 - 为什么arr [i]%2 === 1工作?

时间:2015-03-16 15:41:25

标签: javascript

Coderbyte问题是: 使用JavaScript语言,让函数DashInsert(str)在str中的每两个奇数之间插入破折号(' - ')。例如:如果str为454793,则输出应为4547-9-3。不要将零计为奇数。

因此,当输入为99946时,输出应为9-9-946。

我有这个解决方案,这不会很有效:

function DashInsert(num) {
var arr = num.toString().split('');
var i = 0;
while(i < arr.length-1){
if( arr[i]%2 !==0 && arr[i+1]%2 !==0){ 
arr.splice(i+1,0,'-'); 
}
i++
}
return arr.join(''); 
}

然后我找到了类似的答案:

function DashInsert(num) {
var arr = num.toString().split('');

var i = 0

while(i < arr.length-1){
if( arr[i]%2===1 && arr[i+1]%2===1){ 
arr.splice(i+1,0,'-'); 
}
i++
}

return arr.join(''); }
str = 99946;
alert(DashInsert(str)); 

任何人都可以解释为什么它应该是arr [i]%2 === 1?

3 个答案:

答案 0 :(得分:0)

两者都是正确的。 例如,取9:9%2!= 0和9%2 == 1。想一想,所有奇数都可以拆分成 2n + 1。模数为2将始终返回1,而不是0.

答案 1 :(得分:0)

对于在沮丧的谷歌阴霾中偶然发现这一点的任何人......

在添加第一个连字符后,它会更改数组的长度,因此在循环中对其进行求值以查看连字符元素!== 0。

由于' - '!== 0,因此添加了另一个连字符。

这也是为什么你继续吹你的堆栈,因为连字符不断改变你的数组的长度(旁注,总是将你的长度缓存在for循环之外的变量中,而是在你的循环中使用它)。

要解决这个问题,你可以在你的if语句中添加更多的&amp;&amp;&amp;&amp;&amp;'s。

if(theArray [x]%2!== 0&amp;&amp; theArray [x + 1]%2!== 0&amp;&amp; theArray [x]!==' - '&amp;&amp; theArray [x + 1]!==' - ')

或者您可以更具体,只查找评估为1的模数结果。

答案 2 :(得分:0)

我试过这个并且它有效..

HTH ..

private static String createDashedString(String str){

    StringBuilder builder = new StringBuilder();
    char[] chararray = str.toCharArray();

    for (int i=0;i<chararray.length-1;i++) {

        int firstInt = Character.getNumericValue(chararray[i]);
        int nextInt = Character.getNumericValue(chararray[i+1]);
        if ((firstInt%2 !=0) && (nextInt%2 !=0)) {
            builder.append(firstInt);
            builder.append("-");
        }else {
            builder.append(firstInt);
        }
    }
    builder.append(chararray[chararray.length-1]);
    return builder.toString();

}


public static void main(String args[]) {

    String str = "999999";
                  //01234
    System.out.println(createDashedString(str));


}