A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© AndroidM 中级黑马   /  2015-7-25 23:55  /  7277 人查看  /  63 人回复  /   7 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 AndroidM 于 2015-7-25 23:54 编辑
最近,刚搞完Android的入学面试,把遇到了一些有价值的面试题分享下吧,  :lol

1 , 金额转换,阿拉伯数字转换成中国传统形式。
* 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
  1. public class Test1 {
  2.     public static void main(String[] args) {
  3.         //测试如下
  4.         System.out.println(changeNum("1234"));
  5.         System.out.println(changeNum("12340123"));
  6.         System.out.println(changeNum("90123410011001"));
  7.         System.out.println(changeNum("101000001010"));
  8.         System.out.println(changeNum("90123400001010"));
  9.         //测试异常
  10.     //    System.out.println(changeNum("90123400001010A"));  
  11.     }
  12.     //完成金额转换方法的定义
  13.     public static String changeNum(String str){
  14.         if(str==null || !str.matches("[0-9]+")){
  15.             throw new RuntimeException("字符串为空或含有非阿拉伯数字");
  16.         }
  17.         String[] num = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
  18.         String[]  arr = {"拾","佰","仟","萬","亿"};
  19.         StringBuilder sb = new StringBuilder();
  20.         //处理万位以下数目
  21.         if(str.length()<5){
  22.             for(int i=str.length() - 1; i >=0;i--){
  23.                 char c  = str.charAt(i);
  24.                 int k = Integer.parseInt(c+"");
  25.                 if(k==0 || i == str.length() - 1){
  26.                     if( k==0 && i==str.length() -1)
  27.                         ;
  28.                     else
  29.                         sb.insert(0, num[k]);
  30.                 }else{
  31.                     sb.insert(0, num[k]+arr[str.length() - i -2]);
  32.                 }
  33.             }
  34.         }
  35.         else{
  36.             //处理亿位以下数目,通过递归 分别处理 万位 及万位以下数据
  37.             if(str.length() < 9){
  38.                 int k = str.length() - 4;
  39.                 String f = changeNum(str.substring(0,k));
  40.                 if(f.equals("零")||f.equals("零圆整"))
  41.                     sb.append(f+changeNum(str.substring(k,str.length())));
  42.                 else
  43.                     sb.append(f+arr[3]+changeNum(str.substring(k,str.length())));
  44.             }else{
  45.                 if(str.length() > 8){
  46.                     int k = str.length() - 8;
  47.                     sb.append(changeNum(str.substring(0,k))+arr[4]+changeNum(str.substring(k,str.length())));
  48.                 }
  49.             }
  50.         }
  51.         //处理字符串中的多零情况,并返回
  52.         return sb.toString().replaceAll("[零]+", "零").replaceAll("[圆整]", "")+"圆整";
  53.     }
  54. }
复制代码
输出答案:
  1. 壹仟贰佰叁拾肆圆整
  2. 壹仟贰佰叁拾肆萬零壹佰贰拾叁圆整
  3. 玖拾萬壹仟贰佰叁拾肆亿壹仟零壹萬壹仟零壹圆整
  4. 壹仟零壹拾亿零壹仟零壹拾圆整
  5. 玖拾萬壹仟贰佰叁拾肆亿零壹仟零壹拾圆整
复制代码

2、编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数,然后打印出这个十进制整数对应的二进制形式。这个程序要考虑输入的字符串不能转换成一个十进制整数的情况,并对转换失败的原因要区分出是数字太大,还是其中包含有非数字字符的情况。
提示:十进制数转二进制数的方式是用这个数除以2,余数就是二进制数的最低位,接着再用得到的商作为被除数去除以2 ,这次得到的余数就是次低位,如此循环,直到被除数为0为止。其实,只要明白了打印出一个十进制数的每一位的方式(不断除以10,得到的余数就分别是个位,十位,百位),就很容易理解十进制数转二进制数的这种方式。
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;

  4. public class Test2 {
  5.         public static void main(String[] args) throws IOException {
  6.                 System.out.println(Integer.MAX_VALUE);
  7.                 System.out.println(Integer.MIN_VALUE);
  8.                 BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  9.                 String line = in.readLine();
  10.                 if(checkDigital(line))
  11.                         throw new RuntimeException("转换错误,含有非数字字符");
  12.                 try{
  13.                         int value  = Integer.parseInt(line);
  14.                         String binary = toBinary(value);
  15.                         System.out.println("right :      :" + Integer.toBinaryString(value));
  16.                         System.out.println("my result :"+binary);
  17.                 }catch (Exception e) {
  18.                         throw new RuntimeException("转换错误,数字过大");
  19.                 }
  20.         }
  21.         private static String toBinary(int value) {
  22.                 StringBuilder sb = new StringBuilder();
  23.                 int y = 0;
  24.                 while(value != 0 ){
  25.                         y = value % 2;
  26.                         value = value/2;
  27.                         sb.insert(0, y);
  28.                 }
  29.                 return sb.toString();
  30.         }
  31.         private static boolean checkDigital(String line) {
  32.                 char[] cs = line.toCharArray();
  33.                 for(char c : cs){
  34.                         if(!Character.isDigit(c)){
  35.                                 return true;
  36.                         }
  37.                 }
  38.                 return false;
  39.         }
  40. }
复制代码

3、 方法中的内部类能不能访问方法中的局部变量,为什么?
这道题可能很多人都和我一样,只知其然,而不知道其所以然, 推荐 看这个帖子,讲的非常好:http://www.cnblogs.com/dolphin0520/p/3811445.html

  答:  可以訪問, 但是必須是用final修飾的局部变量, 因為在內部類中使用的局部變量是外部方法內變量的一個拷貝,
     是編譯器在創建內部類時自動傳給內部類的,為了防止內部類中變量與方法中變量出現數據不一致的情況,所以使用
      的变量必須要用final修飾。

4、 编写程序,生成5个1至10之间的随机整数,存入一个List集合,

     * 编写方法对List集合进行排序(自定义排序算法,禁用Collections.sort方法和TreeSet),然后遍历集合输出。
  1. public class Test4 {
  2.         public static void main(String[] args) throws IOException {
  3.                 List<Integer> list = new ArrayList<Integer>();
  4.                 for(int i=0; i<5; i++)
  5.                         list.add(new Random().nextInt(10));
  6.                 System.out.println(list);
  7.                 //sortMaopao(list);
  8.                 //sortChoose(list);
  9.                 sortInsert(list);
  10.         }
  11. }
  12. //插入排序
  13.         private void sortInsert(List<Integer> list) {
  14.                 for(int i=1; i<list.size(); i++){
  15.                         int j;
  16.                         int temp = list.get(i);
  17.                         for( j=i; j>0&& temp <list.get(j-1) ; j--){
  18.                                 list.set(j, list.get(j-1));
  19.                         }
  20.                         list.set(j, temp);
  21.                 }
  22.                 System.out.println(list);
  23.         }
  24. //选择排序
  25.         private void sortChoose(List<Integer> list) {
  26.                 for(int i=0; i<list.size(); i++){
  27.                         for(int j=i+1; j<list.size(); j++){
  28.                                 if(list.get(i)>list.get(j)){
  29.                                         int temp = list.get(i);
  30.                                         list.set(i, list.get(j));
  31.                                         list.set(j, temp);
  32.                                 }
  33.                         }
  34.                 }
  35.                 System.out.println(list);
  36.         }
  37. //冒泡排序
  38.         private void sortMaopao(List<Integer> list) {
  39.                 for(int i=1; i<list.size(); i++){
  40.                         for(int j=0; j<list.size()-i; j++){
  41.                                 if(list.get(j)>list.get(j+1)){
  42.                                         int temp = list.get(j);
  43.                                         list.set(j, list.get(j+1));
  44.                                         list.set(j+1, temp);
  45.                                 }
  46.                         }
  47.                 }
  48.                 System.out.println(list);
  49.         }
  50. }
复制代码



63 个回复

正序浏览
回复 使用道具 举报
挺难的,特别是第一题
回复 使用道具 举报
可以,很强势!
回复 使用道具 举报
看的懵懵的  
回复 使用道具 举报
多谢分享
回复 使用道具 举报
barny 中级黑马 2016-10-6 16:38:51
59#
做完了,还有几天就点招,这几天我搞了题海战术
回复 使用道具 举报
厉害啊   .不错收藏了
回复 使用道具 举报
感谢分享
回复 使用道具 举报
楼主,你这是入学考试那10道题里的吧?面试也这个难度?我自己第一次做的时候3道题连想带做1个小时根本做不完。
回复 使用道具 举报
好难啊,感觉有点难度
回复 使用道具 举报
学习学习
回复 使用道具 举报
感谢分享,
回复 使用道具 举报
谢谢楼主分享,学习ing
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
楼主好人  谢谢分享
回复 使用道具 举报
这是个好帖子  赞
回复 使用道具 举报
先收藏了{:2_30:}
回复 使用道具 举报
帮顶一哈
回复 使用道具 举报
xiaogui 来自手机 中级黑马 2016-4-28 20:31:52
46#
我要看看,自己不是很懂,先留着以后用。
回复 使用道具 举报
1234下一页
您需要登录后才可以回帖 登录 | 加入黑马