题解 | #学英语#
学英语
https://www.nowcoder.com/practice/1364723563ab43c99f3d38b5abef83bc
Java-数字处理题目
本题主要考察的是数字的处理操作,特点是每次处理的数据量较小,但是每次的逻辑和条件比较繁杂
在分析这种题的时候,首先需要一个对数据处理的方式来解决一些大的数据提取问题,本题使用的就是整除运算和取模运算
在逻辑分析上,我们最好把逻辑之间的依赖理清,这样在每次处理数据时,我们能够获取所有需要的数据
主要的逻辑线
- 当个位数或者十位数不为零,并且百位数不为零时,需要在之间添加一个and
- 根据具体的数据权重,增加计量单位
- 当个位和十位数组成的数字小于20,大于0时,统一得到一个对应的英文
- 当个位和十位组成的数字大于等于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中,但是如果能够使用一个链表先存储,最后进行结果的构建,那么代码的清晰度可以提高很多。
还有一些逻辑也需要优化,请各位大佬指正🙇🙇