分享

笔试题--金山

 暖风醉伊人 2013-09-16

金山2013笔试题含答案

分类: C/C++/Java 笔试面试 332人阅读 评论(4) 收藏 举报

1、请实现这么一个函数:传入一个int值,在屏幕输出类似LED显示屏效果的字母拼图,例如:

输入1234567890,输出:

提示:请注意每个字符的固定宽度和高度,两个数字间保留一个空格。

  1. import java.util.Scanner;  
  2. /* 
  3. A, B, C, D 表示数字的各二进制位 
  4. a, b, c, d, e, f, g 表示 LED 的各段,为 1 时该段显示,为 0 时该段不显示 
  5.   
  6.       a 
  7.    ####### 
  8.    #     # b 
  9.  f #  g  # 
  10.    ####### 
  11.    #     # c 
  12.  e #     #  
  13.    ####### 
  14.       d 
  15.   
  16. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  17. |   | A | B | C | D |  | a | b | c | d | e | f | g | 
  18. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  19. | 0 | 0 | 0 | 0 | 0 |  | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 
  20. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  21. | 1 | 0 | 0 | 0 | 1 |  | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 
  22. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  23. | 2 | 0 | 0 | 1 | 0 |  | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 
  24. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  25. | 3 | 0 | 0 | 1 | 1 |  | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 
  26. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  27. | 4 | 0 | 1 | 0 | 0 |  | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 
  28. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  29. | 5 | 0 | 1 | 0 | 1 |  | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 
  30. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  31. | 6 | 0 | 1 | 1 | 0 |  | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 
  32. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  33. | 7 | 0 | 1 | 1 | 1 |  | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 
  34. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  35. | 8 | 1 | 0 | 0 | 0 |  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 
  36. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  37. | 9 | 1 | 0 | 0 | 1 |  | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 
  38. +---+---+---+---+---+  +---+---+---+---+---+---+---+ 
  39. */  
  40. public class Num2LEDTest {  
  41.    
  42.     public static void main(String[] args) {  
  43.         LED led = new LED();  
  44.         Scanner in=new Scanner(System.in);  
  45.         String LEDStr=in.nextLine();  
  46.         char[][] chss = led.getLED(LEDStr);  
  47.         LED.print(chss);  
  48.     }  
  49. }  
  50.    
  51. class LED {  
  52.        
  53.     /** 
  54.      * 每个 LED 的大小,可以进行调整 
  55.      */  
  56.     public final static int ROW = 7;  
  57.     public final static int COL = 7;  
  58.        
  59.     /** 
  60.      * 每个 LED 的间隔 
  61.      */  
  62.     private final static int SEPARATOR = 1;  
  63.            
  64.     private final static char FILL_CHAR = '#';  
  65.     private final static char SPACE_CHAR = ' ';  
  66.        
  67.     /** 
  68.      * 工具方法,用于输出 LED 
  69.      * @param chs 
  70.      */  
  71.     public static void print(char[][] chs) {  
  72.         for(int i = 0; i < chs.length; i++) {  
  73.             for(int j = 0; j < chs[i].length; j++) {  
  74.                 System.out.print(chs[i][j]);  
  75.             }  
  76.             System.out.println();  
  77.         }          
  78.     }  
  79.        
  80.     /** 
  81.      * 根据数字得到 LED 显示数组 
  82.      * @param num 
  83.      * @return 
  84.      */  
  85.     public char[][] getLED(String num) {  
  86.         char[] chs = num.toCharArray();  
  87.         char[][][] chsss = new char[chs.length][][];  
  88.         for(int i = 0; i < chs.length; i++) {  
  89.             chsss[i] = showLed(chs[i] - '0');  
  90.         }  
  91.         return putManyLed(chsss);  
  92.     }      
  93.        
  94.     /** 
  95.      * 将多个 LED 组成一排 
  96.      * @param chsss 
  97.      * @return 
  98.      */  
  99.     private char[][] putManyLed(char[][][] chsss) {  
  100.         if(chsss.length < 1) {  
  101.             throw new IllegalArgumentException("LED is NULL!");  
  102.         }  
  103.         if(chsss.length == 1) {  
  104.             return chsss[0];  
  105.         }  
  106.         char[][] chss = new char[ROW][chsss.length * (COL + SEPARATOR) - SEPARATOR];  
  107.         for(int i = 0; i < chsss.length; i++) {  
  108.             int m = i * (COL + SEPARATOR);  
  109.             for(int j = 0; j < chsss[i].length; j++) {                  
  110.                 for(int k = 0; k < chsss[i][j].length; k++) {  
  111.                     chss[j][m + k] = chsss[i][j][k];  
  112.                 }  
  113.             }  
  114.         }  
  115.         for(int i = 0; i < chss.length; i++) {  
  116.             for(int j = 0; j < chss[i].length; j++) {  
  117.                 if(chss[i][j] != FILL_CHAR) {  
  118.                     chss[i][j] = SPACE_CHAR;  
  119.                 }  
  120.             }  
  121.         }  
  122.         return chss;  
  123.     }  
  124.        
  125.     /** 
  126.      *  
  127.      * @param num 
  128.      * @return 
  129.      */  
  130.     private char[][] showLed(int num) {  
  131.         boolean[] b = getLed(num);  
  132.         char[][] chs = new char[ROW][COL];  
  133.         if(b[0])  
  134.             for(int i = 0; i < COL; i++) chs[0][i] = FILL_CHAR;   
  135.         if(b[1])  
  136.             for(int i = 0; i <= ROW / 2; i++) chs[i][COL - 1] = FILL_CHAR;  
  137.         if(b[2])  
  138.             for(int i = ROW / 2; i < ROW; i++) chs[i][COL - 1] = FILL_CHAR;  
  139.         if(b[3])  
  140.             for(int i = 0; i < COL; i++) chs[ROW - 1][i] = FILL_CHAR;  
  141.         if(b[4])  
  142.             for(int i = ROW / 2; i < ROW; i++) chs[i][0] = FILL_CHAR;  
  143.         if(b[5])  
  144.             for(int i = 0; i <= ROW /2; i++) chs[i][0] = FILL_CHAR;  
  145.         if(b[6])  
  146.             for(int i = 0; i < COL; i++) chs[ROW / 2][i] = FILL_CHAR;          
  147.         return chs;  
  148.     }  
  149.        
  150.     /** 
  151.      * 译码器 
  152.      *  
  153.      *       0 
  154.      *    ####### 
  155.      *    #     # 1 
  156.      *  5 #  6  # 
  157.      *    ####### 
  158.      *    #     # 
  159.      *  4 #     # 2 
  160.      *    ####### 
  161.      *       3 
  162.      *  
  163.      * 0 表示 leds[0],若为 true 表示该 LED 显示,否则不显示 
  164.      *  
  165.      * @param num 
  166.      * @return 
  167.      */  
  168.     private boolean[] getLed(int num) {          
  169.         boolean a = (num & 8) >>> 3 == 1;  
  170.         boolean b = (num & 4) >>> 2 == 1;  
  171.         boolean c = (num & 2) >>> 1 == 1;  
  172.         boolean d = (num & 1) == 1;  
  173.         boolean[] leds = new boolean[7];  
  174.         leds[0] = (!a & !b & !c & d) | (b & !d);  
  175.         leds[1] = (b & !c & d) | (b & c & !d);  
  176.         leds[2] = !b & c & !d;  
  177.         leds[3] = (b & !c & !d) | (!b & !c & d) | (b & c & d);  
  178.         leds[4] = d | (b & !c);  
  179.         leds[5] = (c & d) | (!b & c) | (!a & !b & d);  
  180.         leds[6] = (!a & !b & !c) | (b & c & d);  
  181.         for(int i = 0; i < 7; i++) {  
  182.             leds[i] = !leds[i];  
  183.         }  
  184.         return leds;  
  185.     }  
  186. }  

运行截图



2、请编写一段代码测试以下函数执行的正确性:

void unique(std::vector<int> & v);

这个函数的职责是去除传入数组中的重复元素。

提示1:函数返回结果不一定是依照某种顺序的

提示2:请尽可能多的考虑各种可能出现bug的情况组合

提示3:你编写的代码应当返回一个int值,返回0表示测试通过,返回1表示出现错误

  1. void unique(vector<int> & v)  
  2. {  
  3.     cout<<"去除重复前的数据"<<v.size()<<endl;  
  4.     for(int i=0;i<v.size();i++)  
  5.         cout<<v[i]<<" ";  
  6.   
  7.     vector<int>::iterator itr = v.begin();  
  8.     for(int i=0;i<v.size();i++)  
  9.     {  
  10.         while (itr != v.end())  
  11.         {  
  12.             if (*itr == v[i])  
  13.                 v.erase(itr);  
  14.                 //v.erase(remove(v.begin(),v.end(),v[i]),v.end());  
  15.                 itr++;  
  16.         }  
  17.     }  
  18.   
  19.   
  20.     cout<<"去除重复后的数据"<<v.size()<<endl;  
  21.     for(int i=0;i<v.size();i++)  
  22.         cout<<v[i]<<" ";  
  23. }  
  24.   
  25. int main()  
  26. {  
  27.     vector<int> v;  
  28.     v.push_back(111);  
  29.     v.push_back(111);  
  30.     v.push_back(11);  
  31.     v.push_back(111);  
  32.     v.push_back(12);  
  33.     unique(v);  
  34. }  

 当连续出现三个相同的时候会出错,求网友给出正解可参考http:///archives/424

 

3、实现如下函数:

void printInChinese(int num);

这个函数输入一个小于100000000(一亿)的正整数,并在屏幕上打印这个数字的中文写法。

例如:

17 -> 一十七

120 -> 一百二十

201 -> 二百零一

1074 -> 一千零七十四

65536 -> 六万五千五百三十六

1010101 -> 一百零一万零一百零一

提示:请注意‘零’的处理。

扩展:如果需要处理通用简化习惯,你将怎么处理,例如:

17 -> 十七

120 -> 一百二

  1. package javaJY;  
  2.   
  3. /* * 金额转换,阿拉伯数字转换成中国传统形式。 * 例如:1010 0000 1010   转换为    
  4.  壹仟零壹拾亿零壹仟零壹拾圆整 
  5.  思路:在两个数组中分别存取和数字对应的传统形式和单位 *   然后从后面往前面打印.  
  6.  */  
  7. public class Num2Rmb2 {  
  8.     public static void main(String[] args) {  
  9.         System.out.println(printInChinese(1));  
  10.         System.out.println(printInChinese(10));  
  11.         System.out.println(printInChinese(100));  
  12.         System.out.println(printInChinese(5005));  
  13.         System.out.println(printInChinese(1357902468));  
  14.         System.out.println(printInChinese(1010101));  
  15.     }  
  16.   
  17.     public static String printInChinese(int number) {  
  18.         char[] chineseNumber = new char[] { '零''壹''贰''叁''肆''伍''陆',  
  19.                 '柒''捌''玖' };  
  20.         char[] units = new char[] { '元''拾''佰''仟''万''拾''佰''仟',  
  21.                 '亿''拾''佰''仟' };  
  22.         StringBuilder sb = new StringBuilder();  
  23.         long lastNumber = 0;  
  24.         int index = 0;  
  25.         while (number > 0) {  
  26.             lastNumber = number % 10;  
  27.             if (lastNumber != 0)// 如果不是零  
  28.             {  
  29.                 sb.insert(0, units[index++]);// 先存进去单位  
  30.                 sb.insert(0, chineseNumber[(int) lastNumber]);// 再存进去数字  
  31.             } else// 如果是零  
  32.             {  
  33.                 if (sb.length() == 0)// 如果个位上是零,就只存进去单位,就是那个'元'  
  34.                 {  
  35.                     sb.insert(0, units[index++]);  
  36.                 } else { // 如果不是此位之后也都是零,则不存任何单位  
  37.                     if (sb.lastIndexOf("元") == 0) {  
  38.                         index++;  
  39.                     } else {  
  40.                         if (sb.charAt(0) != '零')// 如果下一位是零,则不存单位  
  41.                         {  
  42.                             sb.insert(0, chineseNumber[(int) lastNumber]);// 再存进去数字  
  43.                             index++;  
  44.                         } else {  
  45.                             index++;  
  46.                         }  
  47.                     }  
  48.                 }  
  49.             }  
  50.             number /= 10;  
  51.         }  
  52.         return sb.toString();  
  53.     }  
  54. }  

输入101010101时好像会出问题,求网友给出解答。
 

 

4、已知完全弹性碰撞公式如下:

其中m1 m2为小球质量,v1 v2为原始速度,v1' v2'是碰撞后的速度。

struct ball_t {

double m; // 质量

double v; // 速度,速度为正表示球体往x轴正方向运动

double pos; // x坐标轴的位置

};

请实现以下函数:

void progress(ball_t & b1, ball_t & b2, double leftWall, double rightWall, double t);

这个函数输入两个球的当前状况(包括质量,速度,在x轴的位置),以及左右墙壁的位置,输出两个球在t秒钟后的状况(包括质量,速度,在x轴的位置)

特殊说明:球体碰撞墙面也是完全弹性碰撞,即球体速度变为原本的负数。

 

  1. struct ball_t {  
  2.     double m; // 质量  
  3.     double v; // 速度,速度为正表示球体往x轴正方向运动  
  4.     double pos; // 在x坐标轴的位置  
  5. };  
  6.   
  7. void progress(struct ball_t b1,struct ball_t b2, double leftWall, double rightWall, double t)  
  8. {  
  9.   double i;  
  10.   b1.pos=leftWall+(int)(b1.v*t+b1.pos)%(int)(rightWall-leftWall);//取余存在一点问题  
  11.           b2.pos=leftWall+(int)(b2.v*t+b2.pos)%(int)(rightWall-leftWall);  
  12.     for(i=0;i<t;i+=0.1)//精确到千分位  
  13.     {  
  14.         if((b1.v*t+b1.pos>leftWall&&b1.v*t+b1.pos<rightWall)&&(b2.v*t+b2.pos>leftWall&&b2.v*t+b2.pos<rightWall))  
  15.         {  
  16.             if(b1.v*t+b1.pos-b2.v*t+b2.pos<=0.000001||b1.v*t+b1.pos-b2.v*t+b2.pos>=-0.000001)  
  17.             {  
  18.                 b1.v=(b1.v*(b1.m-b2.m)+2*b2.m*b2.v)/(b1.m+b2.m);  
  19.                 b2.v=(b2.v*(b2.m-b1.m)+2*b1.m*b1.v)/(b1.m+b2.m);  
  20.             }  
  21.         }  
  22.         else if(b1.v*t+b1.pos<=leftWall||b1.v*t+b1.pos>=rightWall)  
  23.         {  
  24.             b1.v=-b1.v;  
  25.         }  
  26.         else if(b2.v*t+b2.pos<=leftWall||b2.v*t+b2.pos>=rightWall)  
  27.         {  
  28.             b2.v=-b2.v;  
  29.         }  
  30.     }  
  31.     printf("t %lf\nb1.m %lf b1.v %lf b1.pos %lf\nb2.m %lf b2.v %lf b2.pos %lf",t,b1.m,b1.v,b1.pos,b2.m,b2.v,b2.pos);  
  32. }  
  33.   
  34. int main()  
  35. {  
  36.     struct ball_t b1,b2;  
  37.     double leftWall,rightWall,t;  
  38.   
  39.     printf("输入第一个球的状态\n");  
  40.     scanf("%lf%lf%lf",&b1.m,&b1.v,&b1.pos);  
  41.     printf("输入第二个球的状态\n");  
  42.     scanf("%lf%lf%lf",&b2.m,&b2.v,&b2.pos);  
  43.     printf("输入左右边界和时间状态\n");  
  44.     scanf("%lf%lf%lf",&leftWall,&rightWall,&t);  
  45.     progress(b1,b2,leftWall,rightWall,t);  
  46.   
  47.     return 0;  
  48. }  

有问题待解决

 

5、一个工程由如下文件组成:

head1.h head2.h src1.cpp src2.cpp main.cpp

最终编译结果为xxx.exe(或者xxx,如果在linux下的话)

请写出你熟悉的某种编译器将这5个文件转换为最终结果xxx.exe(或xxx)的详细过程。写出每一个步骤,并作相关的解释,如果你熟悉某编译器的话,请写出这个编译器每一步用到的命令行。


gcc    main.o   src1.o   src2.o   -o     xxx   

gcc    main.c      -c   mian.o   


src1.o : src1.cpp head1.h
gcc -c src1.cpp                              等价于  gcc   src1.cpp   -c   src1.o 


src2.o : src2.cpp head2.h
gcc -c src2.cpp                              等价于  gcc   src2.cpp   -c   src2.o 

 

在Linux下
xxx: src1.o src2.o main.o
gcc  -o main.o xxx   -----        
main.o:main.c              |不知道这两步是否正确
gcc -c main.c           -----
src1.o : src1.cpp head1.h
gcc -c src1.cpp
src2.o : src2.cpp head2.h
gcc -c src2.cpp

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约