题解 | #学英语#

学英语

https://www.nowcoder.com/practice/1364723563ab43c99f3d38b5abef83bc

Java-数字处理题目

  • 本题主要考察的是数字的处理操作,特点是每次处理的数据量较小,但是每次的逻辑和条件比较繁杂

  • 在分析这种题的时候,首先需要一个对数据处理的方式来解决一些大的数据提取问题,本题使用的就是整除运算和取模运算

  • 在逻辑分析上,我们最好把逻辑之间的依赖理清,这样在每次处理数据时,我们能够获取所有需要的数据

    主要的逻辑线

    1. 个位数或者十位数不为零,并且百位数不为零时,需要在之间添加一个and
    2. 根据具体的数据权重,增加计量单位
    3. 个位和十位数组成的数字小于20,大于0时,统一得到一个对应的英文
    4. 当个位和十位组成的数字大于等于20时,分开获取个位和十位对应的英文
  • 由此可见,每次我们从原数中获取从低位开始的三位数之后,需要得到这三位数个位数,十位数,百位数、数据权重、个位数和十位数组成的数据的大小,根据这些数据信息,我们就可以确定每一位如何映射对应的英文符号,或者说如何进行响应的转化。

    代码实现

    import java.util.Scanner;
    public class Main {
      public static void main(String[] args)  {
        Scanner scanner = new Scanner(System.in);
          long num = scanner.nextLong();
          // 进行一个字符串的映射
          String[][] n = {{"one","two","three","four","five","six","seven","eight","nine"},
                  {"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"},
                  {"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"}};
          String[] count = {"","thousand","million","billion"};
          // 开始进行数据的处理
          int modTime1=0,modTime2 = 0;
          StringBuilder sb= new StringBuilder();
          while(num>0){
              long subNum = num%1000;
              modTime1++;
              modTime2 = 0;
              long bit1=0,bit2=0,bit3=0;
              StringBuilder sb2 = new StringBuilder();
              while(subNum>0){
                 long bit = subNum % 10;
                 modTime2++;
                 // 开始进行处理
                  if(modTime2==1) bit1=bit;
                  if(modTime2==2) bit2=bit;
                  if(modTime2==3) bit3=bit;
                  if(subNum<10){
                      // 对于个位单独处理
                      if(bit1!=0 && bit2!=1) sb2.insert(0," "+n[0][(int)bit1-1]);
                      if(bit2==1) sb2.insert(0," "+n[1][(int)bit2*10+(int)bit1-10]);
                      if(bit2!=0 && bit2!=1) sb2.insert(0," "+n[2][(int)bit2-2]);
                      //if(bit2!=1 && bit1!=0) sb2.insert(0," "+n[0][(int)bit1-1]);
                      if((bit1!=0 || bit2!=0) && bit3!=0) sb2.insert(0," and");
                      if(bit3!=0)sb2.insert(0," "+n[0][(int)bit3-1]+" hundred");
                      sb2.append(" "+count[modTime1-1]);
                  }
                 subNum /=10;
              }
              sb.insert(0,sb2);
              num /= 1000;
          }
          System.out.println(sb.toString().substring(1,sb.length()));
      }
    }

    代码优化

  • 在解决这类数据量较小,逻辑较为复杂的题目时,可以先使用一些数据结构对零散的处理结果进行存储,最后及逆行结果的组装,这样可以使得代码更加清晰,比如以上代码每次直接将结果组装到StringBuilder中,但是如果能够使用一个链表先存储,最后进行结果的构建,那么代码的清晰度可以提高很多。

  • 还有一些逻辑也需要优化,请各位大佬指正🙇‍🙇‍

全部评论

相关推荐

11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务