projecteuler_projecteuler.net#17

projecteuler

我刚刚完成了Euler#17项目。 我将在这里解决我的思考过程,但是希望得到反馈,特别是如果您的解决方案不同于我的解决方案时。 我敢肯定,还有更多更优雅,更简单的解决方案。

问题如下:

如果数字1到5用单词写出:1、2、3、4、5,则总共使用3 + 3 + 5 + 4 + 4 = 19个字母。

如果用文字写出从1到1000(含1000)之间的所有数字,那么将使用多少个字母?

注意:不要计算空格或连字符。 例如,342(三百四十二)包含23个字母,而115(一百一十五)包含20个字母。 写出数字时使用“和”符合英国的用法。

我首先想到的是,我需要将数字1循环到1000,然后将每个数字转换成与该数字相对应的文字。

自然,我可以制作一个包含每个书面单词的数组。 但是我不想写每个数字。 相反,我考虑做这样的事情:

如果不定义每个字母,我可以将数字1到9组成一个数组,然后再将字母“ one”到“ 9”组成另一个数组。

例如,如果该数字为547,则可以看到给定数字集中的第一个数字是否与“ onesArr”中的任何数字匹配。 然后,我可以对最后一个数字执行相同的操作。 一旦找到匹配项,我将简单地代替onesComp数组的值,但是要使用在onesArr中找到匹配项的相同索引。

虽然,这不适用于“二十”,“三十”,“四十”等。它也不适用于10到19。因此,我可以制作几个额外的数组,并做同样的事情,具体取决于在给定数字的长度上。

这样的事情会让我有一个1到10的数字数组,和一个匹配的单词数组“ 1”到“ 10”。 十几岁甚至几十岁也是如此。 对我来说,关键是使索引值匹配。 所以我的一个数组从1而不是0开始,因为我们没有使用零,而我的teens数组的确包含一个零,因为它从10开始,并且我将在数字10中寻找0,就像我将寻找11中的1和12中的2,依此类推。然后tens数组以2和20开始。 那时,下一个障碍将是确定号码的长度。 我的想法是要遍历1到1000的数组。对于每个项目,我都将数字转换为字符串,然后将字符串拆分,这样它将为我提供每个数字的数组。 然后,在if语句中,我将使用parseInt()将其转换回数字,并根据比较数组的值进行检查。 该部分可能看起来像这样:

这是最终的代码:

let ones = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
let teens = ['ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];
let tens = ['twenty', 'thrity', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'];
let thousands = ['thousand'];
let compareOnes = [1,2,3,4,5,6,7,8,9];
let compareTeens = [0,1,2,3,4,5,6,7,8,9];
let compareTens = [2,3,4,5,6,7,8,9];
let numbers = [];
for (var i = 1; i <= 1000; i++) {
numbers.push(i);
}
let currentCount = 0;
for (var i = 0; i < numbers.length; i++) {
let numStr = numbers[i].toString();
let numStrArr = numStr.split("");
if(numStrArr.length == 1){
let digit1 = parseInt(numStrArr[0]);
let index = compareOnes.indexOf(digit1);
currentCount = currentCount + ones[index];
}
if(numStrArr.length == 2 && numbers[i]>=20){
let digit1 = parseInt(numStrArr[0]);
let digit2 = parseInt(numStrArr[1]);
let index = compareTens.indexOf(digit1);
let index2 = compareOnes.indexOf(digit2);
currentCount = currentCount + tens[index] + ones[index2];
}
if(numStrArr.length == 2 && numbers[i]<20){
let digit2 = parseInt(numStrArr[1]);
let index2 = compareTeens.indexOf(digit2);
currentCount = currentCount + teens[index2];
}
if(numStrArr.length == 3 && numStrArr[1] == "0" && numStrArr[2] == "0"){
let digit1 = parseInt(numStrArr[0]);
let digit2 = parseInt(numStrArr[1]);
let digit3 = parseInt(numStrArr[2]);
let index3 = compareOnes.indexOf(digit1);
let index2 = compareTens.indexOf(digit2);
let index = compareOnes.indexOf(digit3);
currentCount = currentCount + ones[index3]+"hundred";
}
if(numStrArr.length == 3 && numStrArr[1] == "0" && numStrArr[2] !== "0"){
let digit1 = parseInt(numStrArr[0]);
let digit2 = parseInt(numStrArr[1]);
let digit3 = parseInt(numStrArr[2]);
let index3 = compareOnes.indexOf(digit1);
let index2 = compareTens.indexOf(digit2);
let index = compareOnes.indexOf(digit3);
currentCount = currentCount + ones[index3]+"hundred"+"and"+tens[index2]+ones[index];
}
if(numStrArr.length == 3 && numStrArr[1] == "1"){
let digit1 = parseInt(numStrArr[0]);
let digit2 = parseInt(numStrArr[1]);
let digit3 = parseInt(numStrArr[2]);
let index3 = compareOnes.indexOf(digit1);
let index2 = compareTeens.indexOf(digit3);
currentCount = currentCount + ones[index3]+"hundred"+"and"+teens[index2];
}
if(numStrArr.length == 3 && numStrArr[1] !== "0" && numStrArr[2] !== "0" && numStrArr[1] !== "1"){
let digit1 = parseInt(numStrArr[0]);
let digit2 = parseInt(numStrArr[1]);
let digit3 = parseInt(numStrArr[2]);
let index3 = compareOnes.indexOf(digit1);
let index2 = compareTens.indexOf(digit2);
let index = compareOnes.indexOf(digit3);
currentCount = currentCount + ones[index3]+"hundred"+"and"+tens[index2]+ones[index];
}
if(numStrArr.length == 3 && numStrArr[1] !== "0" && numStrArr[2] == "0" && numStrArr[1] !== "1"){
let digit1 = parseInt(numStrArr[0]);
let digit2 = parseInt(numStrArr[1]);
let digit3 = parseInt(numStrArr[2]);
let index3 = compareOnes.indexOf(digit1);
let index2 = compareTens.indexOf(digit2);
let index = compareOnes.indexOf(digit3);
currentCount = currentCount + ones[index3]+"hundred"+"and"+tens[index2];
}
if(numStrArr.length == 4){
currentCount = currentCount + "one"+"thousand";
}
}

let newCurrent = currentCount.replace(/undefined/g, "");
console.log(newCurrent);
console.log(newCurrent.length)

您可能会在底部看到我的正则表达式。 我一直有不确定的出现,它只是被添加到那里。 我本可以尝试找出原因,但是很明显,我所需的所有其他单词仍然存在,因此我只写了一些正则表达式来消除最终字符串中的所有未定义内容。

这就是最后一个字符串的样子……好吧,只是前75个数字:

onetwothreefourfivesixseveneightnineteneleventwelvethirteenfourteenfifteensixteenseventeeneighteennineteentwentytwentyonetwentytwotwentythreetwentyfourtwentyfivetwentysixtwentyseventwentyeighttwentyninethritythrityonethritytwothritythreethrityfourthrityfivethritysixthrityseventhrityeightthrityninefortyfortyonefortytwofortythreefortyfourfortyfivefortysixfortysevenfortyeightfortyninefiftyfiftyonefiftytwofiftythreefiftyfourfiftyfivefiftysixfiftysevenfiftyeightfiftyninesixtysixtyonesixtytwosixtythreesixtyfoursixtyfivesixtysixsixtysevensixtyeightsixtynineseventyseventyoneseventytwoseventythreeseventyfourseventyfive

翻译自: https://hackernoon.com/projecteuler-net-17-dabc52166aba

projecteuler

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值