如何检查字符串中的每个单独的数字?

问题描述:

在Codewars.com上,我接受了将一串数字转换为'假二进制'的挑战,并且我将每个数字转换为0或1,如果数字小于5,它应该变为0 ,如果它是5或以上,应该成为1.我知道如何去分析,像这样整个字符串的值:如何检查字符串中的每个单独的数字?

function fakeBin(x){ 
if (x < 5) 
return 0; 
else return 1; 
} 

然而,这分析整个字符串的值,我怎么会去分析每个字符串中的个人数字而不是整个事物?

注:我已经看过网站上的解决方案,并不理解他们,我没有作弊。

+0

首先,你需要确保你得到的字符串。如果不是,那么你需要将它转换为字符串,然后使用'x.split(“”);然后循环来生成你的输出字符串。 –

+0

数字是如何分隔的?字符串中的数字是否都是“ guest271314

+0

你想改变数字吗?还是你想要返回一个新的字符串? –

下面的代码片段将采用一个字符串,并根据您所描述的内容返回由零和/或一个零组成的新字符串。

我们使用for ...of循环遍历输入字符串,将增加一个0或1,我们基于阵列的回报是否解析INT如果大于或小于5

另外请注意,我们正在检查和投掷如果该字符不是数字,则为错误。

const word = "1639"; 
 

 
const stringToBinary = function(str) { 
 
    let ret = []; 
 
    for (const char of word) { 
 
    if (Number.isNaN(parseInt(char, 10))) { 
 
     throw new Error(`${char} is not a digit!`); 
 
    } else { 
 
     const intVal = parseInt(char, 10); 
 
     ret.push(intVal > 5 ? 1 : 0); 
 
    } 
 
    } 
 
    return ret.join(''); 
 
}; 
 

 
console.log(stringToBinary(word));

拆分字符串并将当前函数应用于字符串的每个元素。你可以用mapreduce做到这一点:

function fakeBin(x) { 
 
    
 
    x = x.split(''); 
 
    
 
    let toBin = x => { 
 
    if (x < 5) 
 
     return 0; 
 
    else return 1 
 
    } 
 
    
 
    return x.map(toBin).join(''); 
 
} 
 

 
console.log(fakeBin("2351"));

重构

function fakeBin(x) { 
 
    x = [...x]; 
 

 
    let toBin = x => x < 5 ? 0 : 1; 
 

 
    return x.map(toBin).join(''); 
 
} 
 

 
console.log(fakeBin("2351"));

减少

function fakeBin(x) { 
 

 
    let toBin = x => x < 5 ? 0 : 1; 
 

 
    return [...x].reduce((acc,val) => acc + toBin(val), ""); 
 

 
} 
 

 
console.log(fakeBin("23519"));

,如果你是在Java中,你可以使用

charAt() 

和你做一个对字的长度,你可以通过一个

for(int i = 0; i < text.length(); i++){ 
yourfunction(texto.charAt(i)); 
} 
+0

*“如果你在java中”* - 该问题标记为“JavaScript”,而不是“Java”...... – nnnnnn

简单的二选一javascript解决方案实现预期解决方案

function fakeBin(x){ 
x = x+'' ; 
var z =[]; 
for(var i=0;i< x.length;i++){ 
    if((x[i]*1)<5){ 
    z[i] =0; 
    }else{ 
    z[i]=1; 
    } 
} 
    return z 
} 

console.log(fakeBin(357)) 
+0

超级难看的代码,+1。我真的不知道它可以做得这么丑。 – Dev

+0

谢谢@Dev的投票 –

你能做到在一个符合两个简单的全局字符串替换操作:

function fakeBin(x){ 
 
    return ("" + x).replace(/[0-4]/g,'0').replace(/[5-9]/g,'1'); 
 
} 
 

 
console.log(fakeBin(1259)) 
 
console.log(fakeBin(7815)) 
 
console.log(fakeBin("1234567890"))

("" + x)部分只是确保你有一个可以使用的字符串,所以函数可以带数字或st环作为输入(如我在上面的示例中所述)。

您可以使用String.prototype.replace()RegExp/([0-4])|([5-9])/g匹配0-45-9,更换0,分别1

let str = "8539734222673566"; 
 

 
let res = str.replace(/([0-4])|([5-9])/g, (_, p1, p2) => p1 ? 0 : 1); 
 
    
 
console.log(res);