damon-dhc

如果把1到5写成英文单词,分别:one ,two,three,four, five,这些单词一共用了3+3+5+4+4=19个字母。

如果把1到1000都写成英文单词,一共要用多少个字母?

注意:不要算上空格和连字符。例如,342(three hundred and forty-two)包含23个字母,而115(one hundred and fifteen)包含20个字母。单词“and”的使用方式遵循英式英语的规则。

 

 

答案是:21124

算法如下:

主函数:

public static int numberLetterCounts() {
        int sum = 0;
        for(int i=1;i<21;i++) {
            sum+= letterCountsOne(i);
        }
        for(int i=21;i<100;i++) {
            sum+= letterCountsTwo(i/10)+letterCountsOne(i%10);
        }
        for(int i=100;i<1000;i++) {
            if(i%100<=20) {
                sum += letterCountsOne(i/100)+(i%100==0?7:10)+letterCountsOne(i%100);
                //i%100==0?7:10 整除时只需加上hundred,非整除时需要加上hundred and
            }else {
                sum += letterCountsOne(i/100)+(i%100==0?7:10)+letterCountsTwo(i%100/10)+letterCountsOne(i%10);
                
            }
        }
        //one thousand
        sum+=11;
        return sum;
    }

 

 

计算1-20的字母数:

public static int letterCountsOne(int num) {
        /**
         * 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
         * 20 - twenty
         * 21 - twenty-one
         * 22 - twenty-two
         * 23 - twenty-three
         * 24 - twenty-four
         * 25 - twenty-fifty
         * 26 - twenty-six
         * 27 - twenty-seven
         * 28 - twenty-eight
         * 29 - twenty-nine
         * 30 - thirty
         * 40 - forty
         * 50 - fifty
         * 60 - sixty
         * 70 - seventy
         * 80 - eighty
         * 90 - ninety
         * 100 - one hundred
         */
        if(num == 1)return 3;
        if(num == 2)return 3;
        if(num == 3)return 4;
        if(num == 4)return 4;
        if(num == 5)return 5;
        if(num == 6)return 3;
        if(num == 7)return 5;
        if(num == 8)return 5;
        if(num == 9)return 4;
        if(num == 10)return 3;
        if(num == 11)return 6;
        if(num == 12)return 6;
        if(num == 13)return 8;
        if(num == 14)return 8;
        if(num == 15)return 7;
        if(num == 16)return 7;
        if(num == 17)return 9;
        if(num == 18)return 8;
        if(num == 19)return 8;
        if(num == 20)return 6;
        
        return 0;
        
    }

 

计算十位的字母数:

public static int letterCountsTwo(int num) {
        if(num==2) return 6;
        if(num==3) return 6;
        if(num==4) return 5;
        if(num==5) return 5;
        if(num==6) return 5;
        if(num==7) return 7;
        if(num==8) return 6;
        if(num==9) return 6;
        return 0;
        
    }

测试:

@Test
    public void testLetterCounts() {
        System.out.println(numberLetterCounts());
    }

 

分析:

这个算法题不难,但是需要大量的统计工作和部分逻辑的梳理,如百位、十位、个位的获取

20以内的字母数量统计可以直接通过letterCountsOne()获取

21-100之间的字母统计,可以通过除法(i/10)获取十位的数字作为参数传给letterCountsTwo()来获取字母数,个位可通过取余(i%10)得到,再传给letterCountsOne()

101-1000之间的字母统计,百位通过除法(i/100)即可得到,这时还需要对稍作判断,此时是否整除,整除只需加上hundred的字母数,否则需要加上hundred and的字母数

1000 -  one thousand 

全部累加即可得到全部字母数

分类:

技术点:

相关文章: