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?
答案 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));
}