题解 | #学英语#
学英语
https://www.nowcoder.com/practice/1364723563ab43c99f3d38b5abef83bc
讲真 这道题真的细节太多了 做了大概一天的样子修补bug 分享一下解题思路及完整代码
//建立参考object,我将个位和十位数为1的情况列在同一个object,另外再将十位数为20及以上的列为一个,百位数可参考个位数;
const object1 = {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 9: 'nine',
10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen', 17: 'seventeen', 18: 'eighteen', 19: 'nineteen'};
const object2 = {2: 'twenty', 3: 'thirty', 4: 'forty', 5: 'fifty', 6: 'sixty', 7: 'seventy', 8: 'eighty', 9: 'ninety'};
//读取输入流;
while (line = readline()) {
//在下面建立了两个function,一个countNumber function, 用于将输入流整理成12位的数据(位数不足的在前面补足0),然后再按照三位一组,建立数组,最后返回输出;
//另外一个convert1 function是用于将媚三位一组的数字转化为英文;最后在for循环中和arr2 = ['billion', 'million', 'thousand']对应的下标对象分别合并即可;
//将输入流转化为三位一组的数组;
let arr1 = countNumber(line).map(x => convert1(x));
let arr2 = ['billion', 'million', 'thousand'];
//如相应的数组元素长度不为0;则证明排除‘000’这种情况,则可在数字后面加上对应单位——'billion', 'million', 'thousand';
for (let i = 0; i < arr1.length-1; i++) {
if (arr1[i].length != 0) {
arr1[i] = arr1[i] + arr2[i];
}
}
//console.log(arr1);
//虽然‘000’这种情况 后面不会加上相应单位,但是仍然会以‘’形式存在数组中,所以需要通过filter(Boolean)排除数组中的空值, 最后join(‘’)输出即可;
console.log(arr1.filter(Boolean).join(' '));
}
//上面一步是最后一步,看上去比较简单,但实际上是因为建立在两个复杂的function上;所以两个function需要花心思;推敲各种情况,具体代码如下,希望对你有帮助;
function convert1(str) {
let hundreds = '';
let tens = '';
let ones = '';
let result = '';
if (str[0] != 0) {
if (str[1] == 0 && str[2] == 0) {
hundreds = object1[str[0]] + ' ' + 'hundred';
result = hundreds;
return result;
}
else {
hundreds = object1[str[0]] + ' hundred and ';
}
}
if (str[1] != 0) {
if (str[1] == 1) {
tens = object1[str.substr(1,2)] + ' ';
result = hundreds + tens;
return result;
}
else {
tens = object2[str[1]] + ' ';
}
}
if (str[2] != 0) {
ones = object1[str[2]] + ' ';
}
result = hundreds + tens + ones;
return result;
}
function countNumber(str) {
let arr = str.padStart(12, '0').split('');
let newArr = [];
for (let i = arr.length - 3; i >=0; i-=3 ) {
newArr.push(arr.slice(i, i+3))
}
if (arr.length % 3 != 0) {
newArr.push(arr.slice(0, arr.length%3));
}
let result = newArr.reverse().map(x => x.join(''));
return result;
}

