记录去大搜车的一道笔试题
java编程题
实现一个字符串数字转人民币的小功能
入参:一个字符串,范围是0.00~999999.99,最多两位小数
出参:对应的人民币大写或者验证不合法
例子1:
input:12345.67
output:壹万贰仟叁佰肆拾伍元陆角柒分
例子2:
input:1000000
output:输入值超出范围
例子3
input:133a055
output:输入的值不是数字
说明一下:当时我的思路是:
(1)根据小数点分割,然后获取到小数点左边的整数位,和右边的小数位。
(2)然后各自根据空格分割,获取到整数位数组和小数位数组。
(3)整数位数组进行从右到左的遍历,这样可以拼接单位(如:元、拾、佰..)
(4)小数位从左到右遍历,好处如(3)
(5)在3、4遍历过程中需要把对应的数字转换成大写中文
遗憾:当时整个思路是这样的,但是手写代码还是不如自己用电脑方便,易改。笔试过程中因为自己写的 例子2、例子3 不符规则的代码 写多了,把位置都占了,不得已说了一下我的思路。不过当时在第三步写的有一点问题。下面有我错误想法的代码。不过我认为整个的思路是没问题的。后来回家后自己电脑敲了一波(下面不符规则的代码就不写了)。
1 public static String transfer(String num){ 2 num="12345.67"; 3 4 String[] chinese={"0,零","1,壹","2,贰","3,叁","4,肆","5,伍","6,陆","7,柒","8,捌","9,玖"}; 5 //此处根据小数点分割 6 String[] str1= num.split("\\."); 7 //这里是根据空格拆分的整数数组 8 String[] str2= str1[0].split(""); 9 //这里是根据空格拆分的小数数组 10 String[] str3= str1[1].split(""); 11 //这里的c 是整数位用来累加遍历次数 以获取到 单位的(元,拾...) 12 // 13 int c=0; 14 StringBuffer sb; 15 StringBuffer newsb=new StringBuffer(); 16 for (int i = str2.length-1; i >=0 ; i--) { 17 sb=new StringBuffer(); 18 //这里是获取int数字转换成中文数字 19 for (int y=0;y<chinese.length;y++){ 20 System.out.println(str2[i]); 21 if(chinese[y].startsWith(str2[i])){ 22 System.out.println(chinese[y]); 23 sb.append(chinese[y].split(",")[1]); 24 break; 25 } 26 } 27 28 //这里当时的错误想法是这里,switch里面的是(str2[i]). 29 // 笔试后面试官说这里有问题,但是后来已经面试完了,我才想起怎么去解决这个问题。大写的尴尬。。。 30 switch (c){ 31 case 0: sb.append("元");break; 32 case 1: sb.append("拾");break; 33 case 2: sb.append("佰");break; 34 case 3: sb.append("仟");break; 35 case 4: sb.append("万");break; 36 // case 5: sb.append("拾万");break; 37 // case 6: sb.append("百万");break; 38 } 39 //整数数组位 替换成数字+单位 40 str2[i]=sb.toString(); 41 c++; 42 } 43 //这里需要把整数数组从左到右 进行拼接显示 44 for (int i = 0; i < str2.length; i++) { 45 newsb.append(str2[i]); 46 } 47 48 //小数位从左到右拼接 49 for (int i =0; i < str3.length ; i++) { 50 sb=new StringBuffer(); 51 for (int y=0;y<chinese.length;y++){ 52 if(chinese[y].startsWith(str3[i])){ 53 System.out.println(chinese[y]); 54 sb.append(chinese[y].split(",")[1]); 55 break; 56 } 57 } 58 switch (i){ 59 case 0: sb.append("角") ;break; 60 case 1: sb.append("分");break; 61 } 62 //这里单纯是为了查看 其实可以省略此步骤 63 str3[i]=sb.toString(); 64 newsb.append(str3[i]); 65 } 66 67 System.out.println(newsb.toString()); 68 return newsb.toString(); 69 }
最后说一下整个面试:
整个面试感觉说了很多,但是也有一部分没回答上来。问的东西很简单。之前看了很多jvm底层的东西,垃圾回收和垃圾收集器等,集合的底层和扩容等。
感觉和第一个面试官唠了四五十分钟把。但是到了第二个面试官,上了就问我不是计算机专业的?我本身是土木工程的(本科),我实话实说。后来的唠嗑感觉面试官都快睡着了,感觉我说的东西他也没听多少。第二天 大搜车发来了邮件给我婉拒了。
整个面试分析下来,两点:
1、自己的有点知识掌握不牢靠、不全面、不深入。但是认为我跟计算机专业的毕业相同时间的人比 ,我不输很多。
2、感觉自己输在了专业上,假如计算机专业毕业是加分项,我这不是的 不是零分而是负数。但是不能一直失落,要越挫越勇,再沉淀下,之后自己要用更多时间学习,来弥补专业问题。