2017-03-04 75 views
0

在Codewars.com上,我接受了將一串數字轉換爲'假二進制'的挑戰,並且我將每個數字轉換爲0或1,如果數字小於5,它應該變爲0 ,如果它是5或以上,應該成爲1.我知道如何去分析,像這樣整個字符串的值:如何檢查字符串中的每個單獨的數字?

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

然而,這分析整個字符串的值,我怎麼會去分析每個字符串中的個人數字而不是整個事物?

注:我已經看過網站上的解決方案,並不理解他們,我沒有作弊。

+0

首先,你需要確保你得到的字符串。如果不是,那麼你需要將它轉換爲字符串,然後使用'x.split(「」);然後循環來生成你的輸出字符串。 –

+0

數字是如何分隔的?字符串中的數字是否都是「<= 9」? – guest271314

+0

你想改變數字嗎?還是你想要返回一個新的字符串? –

回答

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));

0

拆分字符串並將當前函數應用於字符串的每個元素。你可以用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"));

0

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

charAt() 

和你做一個對字的長度,你可以通過一個

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

*「如果你在java中」* - 該問題標記爲「JavaScript」,而不是「Java」...... – nnnnnn

2

簡單的二選一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的投票 –

4

你能做到在一個符合兩個簡單的全局字符串替換操作:

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環作爲輸入(如我在上面的示例中所述)。

0

您可以使用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);

相關問題