题解 | #学英语#

学英语

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



全部评论

相关推荐

牛客44664404...:把个人技能删了搞这么长干什么!还有你面试要先针对那个公司的技术栈专门去准备,别一问三不知,他需要你会他们公司对口的技术,写这么多不对口没有用
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务