今天去一家公司参加笔试,其中有几个题目觉得做的不是太好,拿出来与大家讨论。

1、智力题

题目大概意思是:有10箱罐头,每箱20瓶,每瓶重800克。其中有一箱每瓶都少50克,现在有一个自动秤,需要一个硬币才能秤,现在你只有一个硬币也就是只能称量一次,问如何找出每瓶少50克的那一箱?
 
这个题目想了半天也不知道如何答,结果留空了。
Javaeye:
xanpeng 写道
第一题思路:第一个箱子取1瓶,第二个取2瓶,。。。,第10箱取10瓶
如果那箱没有少50克,则总共重800*(1+2+...+10) = 44000
实际有一箱每瓶是少50克的,实际称出重量y克
则有 44000 - y = x*50, x 就是第 x 个箱子,就是目标箱子

polaris注:当时没考虑拆箱拿出来。因为题目上说是一个工厂的人给一个公司送的10箱罐头,返回时,他老板打电话给他,说有一箱有问题,要他挑出来,我觉得是包装好了的,拆开不太行吧,都拆开,公司不愿意吧,所以觉得题目是不是有问题,没法解。看来还是得拆开。

2、基础题

2.1 在一个平面中画999条线,最多可以分为多少部分。写出推导公式。

见到此题的第一想法是:利用数学中的归纳法,根据1、2、3、4等条线时可分出的数量推导出公式。然而,这种方法证明比较麻烦。然后就想其他方法,当然就是找规律了,想到的是根据交点数来计算,不过这种方法试了一下,发现有点难度,似乎不可行。最后想来想去还是使用了归纳法,毕竟来的容易,只是没有写证明过程。

2.2 什么是软件生命周期?有哪几个阶段?

当时学软件工程的时候都记着的,这时候一下子忘记了。就胡乱写了几个。不过也大概对了。这样的题目感觉没多大意思,完全记忆性的。
 
该题的答案(供参考):
 
软件生命周期(SDLC,软件生存周期)是软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,这种按时间分程的思想方法是软件工程中的一种思想原则,即按部就班、逐步推进,每个阶段都要有定义、工作、审查、形成文档以供交流或备查,以提高软件的质量。
 
软件生命周期(SDLC)的六个阶段
 
(1)问题的定义及规划。
此阶段是软件开发方与需求方共同讨论,主要确定软件的开发目标及其可行性。
 
(2)需求分析。
在确定软件开发可行的情况下,对软件需要实现的各个功能进行详细分析。需求分析阶段是一个很重要的阶段,这一阶段做得好,将为整个软件开发项目的成功打下良好的基础。"唯一不变的是变化本身",同样需求也是在整个软件开发过程中不断变化和深入的,因此我们必须制定需求变更计划来应付这种变化,以保护整个项目的顺利进行。
 
(3)软件设计。
此阶段主要根据需求分析的结果,对整个软件系统进行设计,如系统框架设计,数据库设计等等。软件设计一般分为总体设计和详细设计。好的软件设计将为软件程序编写打下良好的基础。
 
(4)程序编码。
此阶段是将软件设计的结果转换成计算机可运行的程序代码。在程序编码中必须要制定统一,符合标准的编写规范。以保证程序的可读性,易维护性,提高程序的运行效率。
 
(5)软件测试。
在软件设计完成后要经过严密的测试,以发现软件在整个设计过程中存在的问题并加以纠正。整个测试过程分单元测试、组装测试以及系统测试三个阶段进行。测试的方法主要有白盒测试和黑盒测试两种。在测试过程中需要建立详细的测试计划并严格按照测试计划进行测试,以减少测试的随意性。
 
(6)运行维护。
软件维护是软件生命周期中持续时间最长的阶段。在软件开发完成并投入使用后,由于多方面的原因,软件不能继续适应用户的要求。要延续软件的使用寿命,就必须对软件进行维护。软件的维护包括纠错性维护和改进性维护两个方面。 

3、编程题

题目:将正整数的阿拉伯钱数转换为中文形式,如1011→一千零一十一,输出。
 
题目要求最好编程实现,不会编程可以用文字说明。
 
这道题并不难,算法思路很多人应该都会,然而,要真正编程实现,且是用笔写出来,要做到很准确就有点难度。
 
polaris解该题的大概思路是:确定正整数的总位数,然后分别用10的多少次方去除和取模,取模的结果再进行除与取模。
 
这里面涉及到很多细节要考虑,比如:多个连续的0,亿、万位的零等。
 
下面是polaris回来在电脑上编写了一个完整的,写的不对或不好之处,请大家指正。大家有更好的可以拿出来一起讨论。(主要d
 
  1. package com.polaris.test; 
  2.  
  3. import java.io.BufferedReader; 
  4. import java.io.InputStreamReader; 
  5. import java.util.HashMap; 
  6. import java.util.Map; 
  7.  
  8. /** 
  9.  * 将正整数的阿拉伯钱数转换为中文形式,如1011→一千零一十一,输出。 
  10.  * @author xuxinhua(polaris) http://www.beijixing001.com 
  11.  * 2010-09-18 
  12.  * @version 1.0 
  13.  */ 
  14. public class TranslateMoney { 
  15.      
  16.     // 保存阿拉伯数字到中文的对应关系 
        private static String[] chineseMapStr = {"零","一","二","三","四","五","六","七","八","九"};
  17.      
  18.     // 保存最后的输出结果 
  19.     private static StringBuilder chinMoney = new StringBuilder(); 
  20.      
  21.     // 多个0连续时,中文只需写出一个零。该变量用于标记是否为连续的0 
  22.     private static int flag = 0
  23.      
  24.     public static void main(String[] args) throws Exception{ 
  25.         // 省略
  26.     } 
  27.      
  28.     /** 
  29.      * 转换函数 
  30.      * @param money 
  31.      * @param digit 
  32.      * @return 
  33.      */ 
  34.     public static String translate(int money, int digit) { 
  35.          
  36.         if(digit==1) { 
  37.             // 如果个位是0,则忽略 
  38.             if(money!=0){ 
  39.                 // 得到数字的中文表示 
  40.                 String chinDigit = chineseMapStr[money]; 
  41.                 chinMoney.append(chinDigit); 
  42.             } 
  43.         } else { 
  44.              
  45.             // 除数 
  46.             int divisor = (int)Math.pow(10, digit-1); 
  47.             // 商 
  48.             int quotient = money / divisor; 
  49.             // 余数 
  50.             int remainder = money % divisor; 
  51.              
  52.             // 得到数字的中文表示 
  53.             String chinDigit = chineseMapStr[quotient]; 
  54.              
  55.             // 得到当前最高位的中文表示 
  56.             String unit = ""
  57.              
  58.             if(quotient!=0) { 
  59.                 // 得到当前最高位的中文表示 
  60.                 unit = getUnit(digit); 
  61.                 flag = 0
  62.             } else { 
  63.                 // 如果亿、万为零,须特殊处理,零不说出,而保留亿或万,这时flag增加 
  64.                 if(digit==9 || digit==5) { 
  65.                     chinDigit = ""
  66.                     unit = getUnit(digit); 
  67.                 } else { 
  68.                     ++flag; 
  69.                 } 
  70.             } 
  71.              
  72.             // 不止一个0 
  73.             if(flag>1) { 
  74.                 // 忽略该位,处理下一位 
  75.                 translate(remainder, digit-1); 
  76.             } else { 
  77.                 // 如果是一十亿、一十万之类的,前面的“一”不要,这样更符合中文习惯 
  78.                 if(quotient==1) { 
  79.                     if(digit==6 || digit==10
  80.                         chinDigit = ""
  81.                 } 
  82.                 chinMoney.append(chinDigit).append(unit); 
  83.                 translate(remainder, digit-1); 
  84.             } 
  85.         } 
  86.          
  87.         return chinMoney.toString(); 
  88.     } 
  89.  
  90.     /** 
  91.      * 位数表示,如亿、万等 
  92.      * @param digit 
  93.      * @return 
  94.      */ 
  95.     private static String getUnit(int digit) { 
  96.         String unit = null
  97.          
  98.         switch(digit) { 
  99.         case 12
  100.         case 8
  101.         case 4
  102.             unit = "千"
  103.             break
  104.         case 11
  105.         case 7
  106.         case 3
  107.             unit = "百"
  108.             break
  109.         case 10
  110.         case 6
  111.         case 2
  112.             unit = "十"
  113.             break
  114.         case 9
  115.             unit = "亿"
  116.             break
  117.         case 5
  118.             unit = "万"
  119.             break
  120.         } 
  121.          
  122.         return unit; 
  123.     } 

下载完整的类文件:TranslateMoney.java(在文章最后)