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、感覺自己輸在了專業上,假如計算機專業畢業是加分項,我這不是的 不是零分而是負數。但是不能一直失落,要越挫越勇,再沉淀下,之后自己要用更多時間學習,來彌補專業問題。