记录去大搜车的一道笔试题

     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、感觉自己输在了专业上,假如计算机专业毕业是加分项,我这不是的 不是零分而是负数。但是不能一直失落,要越挫越勇,再沉淀下,之后自己要用更多时间学习,来弥补专业问题。

   

posted @ 2018-07-28 11:39  _Phoenix  阅读(3501)  评论(2编辑  收藏  举报