`

几个笔试题目(2010-09-18)

    博客分类:
  • Java
阅读更多

感谢大家,一些问题经过大家讨论变得很明朗。谢谢!对大家一些回复进行了一个小结,大家可以点击此处查看。

 

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

1、智力题

题目大概意思是:有10箱罐头,每箱20瓶,每瓶重800克。其中有一箱每瓶都少50克,现在有一个自动秤,需要一个硬币才能秤,现在你只有一个硬币也就是只能称量一次,问如何找出每瓶少50克的那一箱?

这个题目想了半天也不知道如何答,结果留空了。
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回来在电脑上编写了一个完整的,写的不对或不好之处,请大家指正。大家有更好的可以拿出来一起讨论。

package com.polaris.test;


/**
 * 将正整数的阿拉伯钱数转换为中文形式,如1011→一千零一十一,输出。
 * @author xuxinhua(polaris) http://www.beijixing001.com



 * 2010-09-18
 * @version 1.0
 */
public class TranslateMoney { 
        // 保存阿拉伯数字到中文的对应关系
        private static String[] chineseMapStr = {"零","一","二","三","四","五","六","七","八","九"}; 
        
        // 保存最后的输出结果
	private static StringBuilder chinMoney = new StringBuilder();
	
	// 多个0连续时,中文只需写出一个零。该变量用于标记是否为连续的0
	private static int flag = 0;
	
	public static void main(String[] args) throws Exception{
		// 省略
	}
	
	/**
	 * 转换函数
	 * @param money
	 * @param digit
	 * @return
	 */
	public static String translate(int money, int digit) {
		
		if(digit==1) {
			// 如果个位是0,则忽略
			if(money!=0){
				// 得到数字的中文表示
				String chinDigit = chineseMapStr[money];
				chinMoney.append(chinDigit);
			}
		} else {
			
			// 除数
			int divisor = (int)Math.pow(10, digit-1);
			// 商
			int quotient = money / divisor;
			// 余数
			int remainder =	money % divisor;
			
			// 得到数字的中文表示
			String chinDigit = chineseMapStr[quotient];
			
			// 得到当前最高位的中文表示
			String unit = "";
			
			if(quotient!=0) {
				// 得到当前最高位的中文表示
				unit = getUnit(digit);
				flag = 0;
			} else {
				// 如果亿、万为零,须特殊处理,零不说出,而保留亿或万,这时flag增加
				if(digit==9 || digit==5) {
					chinDigit = "";
					unit = getUnit(digit);
				} else {
					++flag;
				}
			}
			
			// 不止一个0
			if(flag>1) {
				// 忽略该位,处理下一位
				translate(remainder, digit-1);
			} else {
				// 如果是一十亿、一十万之类的,前面的“一”不要,这样更符合中文习惯
				if(quotient==1) {
					if(digit==6 || digit==10)
						chinDigit = "";
				}
				chinMoney.append(chinDigit).append(unit);
				translate(remainder, digit-1);
			}
		}
		
		return chinMoney.toString();
	}

	/**
	 * 位数表示,如亿、万等
	 * @param digit
	 * @return
	 */
	private static String getUnit(int digit) {
		String unit = null;
		
		switch(digit) {
		case 12:
		case 8:
		case 4:
			unit = "千";
			break;
		case 11:
		case 7:
		case 3:
			unit = "百";
			break;
		case 10:
		case 6:
		case 2:
			unit = "十";
			break;
		case 9:
			unit = "亿";
			break;
		case 5:
			unit = "万";
			break;
		}
		
		return unit;
	}
}
 下载完整的类文件:TranslateMoney.java (在文章最后)
分享到:
评论
49 楼 Wallian_hua 2010-09-20  
hackpro 写道
第一题:
条件:只能称一次,硬币只能用一次

称量方法:先把 10箱全部放在称上,然后按上硬币,使称可以使用,然后依次拿走物品,记下每次拿走物品时,称上显示的度量值。然后找到不同度量值时那次拿下的物品,这个就是少50克的那一箱..
第二题: 999条线,最多能组多少个部分:
     
        一个部分 认为是一个平面, 那么一个平面至少有3个点 
        999 条线 认为有 999个点。三条直播相交才能确定一个平面,
       所以一条直线。我们看作是一个点
   那么就可以用排列组算 C(999---3)的排列组合了
   排列组合是高中的知识,已经模糊了,让我在看看资料。
   查到组合公式了:
   C(999,3)
   =C(999,3)
  = 999*998*996/6 



我觉得第一题答得有点意思,我发现我们都有一个毛病,就是喜欢拿数学知识来解决我们现实生活的一些问题
我觉得

逻辑!=数学

48 楼 dai03070609 2010-09-20  
哥们,你这是亚信的笔试题吧?
47 楼 beipiaoonline 2010-09-20  
第一题这样行不行:
十箱一块称,然后一箱一箱的往下拿,因为除了一箱少的,其余的都是一样重的
46 楼 polaris1119 2010-09-20  
miaoxb 写道
yangkunlin 写道
基础题:通项公式为an = a(n-1)+n;a1=2;则a999=999001

再补充一下:
an = a(n-1) + n,a1 = 2;算是已知条件,经过分析,可以得出通项公式为 an = n(n+1)/2 + 1
则a999=999(999 + 1)/2 + 1=499501

不知这个答案怎么样?

刚开始想求前n项和,纠结了半天,原来是求数列的第n项……

就是这样的,这个很多人都知道。关键是这个是需要证明的。前面已经有牛人证明了。
45 楼 miaoxb 2010-09-20  
yangkunlin 写道
基础题:通项公式为an = a(n-1)+n;a1=2;则a999=999001

再补充一下:
an = a(n-1) + n,a1 = 2;算是已知条件,经过分析,可以得出通项公式为 an = n(n+1)/2 + 1
则a999=999(999 + 1)/2 + 1=499501

不知这个答案怎么样?

刚开始想求前n项和,纠结了半天,原来是求数列的第n项……
44 楼 yunduanyucan 2010-09-19  
hackpro 写道
第一题:
条件:只能称一次,硬币只能用一次

称量方法:先把 10箱全部放在称上,然后按上硬币,使称可以使用,然后依次拿走物品,记下每次拿走物品时,称上显示的度量值。然后找到不同度量值时那次拿下的物品,这个就是少50克的那一箱..
第二题: 999条线,最多能组多少个部分:
     
        一个部分 认为是一个平面, 那么一个平面至少有3个点 
        999 条线 认为有 999个点。三条直播相交才能确定一个平面,
       所以一条直线。我们看作是一个点
   那么就可以用排列组算 C(999---3)的排列组合了
   排列组合是高中的知识,已经模糊了,让我在看看资料。
   查到组合公式了:
   C(999,3)
   =C(999,3)
  = 999*998*996/6 


第二题错了!哪有你说的这么简单。
“三条直播相交才能确定一个平面”×
43 楼 polaris1119 2010-09-19  
youaretheboy 写道
第三编程题,其实可以把数字从小到大一个一个push压栈,然后循环出栈pop,判断每次出栈的数据是否为0,如果不是0的话,就判断栈的总数,可以得出位数(如万,千等),如果为0的话,就一直出栈,不做任何处理...大概思路是这样

思路很好。不过有一个地方,是0也不能啥也不处理,得输出零字,如果多个零只输出一个,如果零在万、亿之类的位上也要特殊处理;对于非0情况,也有需要另外处理的,比如1在十万位上,万位是0和不是0处理方式也会不一样吧。需要考虑的地方还是蛮多的。不过思路挺好的。
42 楼 yangjitang100 2010-09-19  
都很简单(除了那道概念题)
41 楼 youaretheboy 2010-09-19  
第三编程题,其实可以把数字从小到大一个一个push压栈,然后循环出栈pop,判断每次出栈的数据是否为0,如果不是0的话,就判断栈的总数,可以得出位数(如万,千等),如果为0的话,就一直出栈,不做任何处理...大概思路是这样
40 楼 yangguo 2010-09-19  
za3999 写道
	public static void main(String[] args) {
		int n=1;
		for (int i = 1; i < 1000; i++) {
			n += i;
		}
		System.out.println("最终:"+n);
	}

最终:499501

 

就这样的IQ还写程序?

  (1+999)*999/2

39 楼 苹果超人 2010-09-19  
<div class="quote_title">polaris1119 写道</div>
<div class="quote_div">
<h1>
<span style="color: #ff0000;">感谢大家,一些问题经过大家讨论变得很明朗。谢谢!</span> </h1>
<p> </p>
<div style="background-color: #ffffff; font-family: Arial, Verdana, sans-serif; line-height: 22px; font-size: 12px; padding: 5px; margin: 0px;">
<div>今天去一家公司参加笔试,其中有几个题目觉得做的不是太好,拿出来与大家讨论。<br>
</div>
<h2>1、智力题<br>
</h2>
<div>题目大概意思是:有10箱罐头,每箱20瓶,每瓶重800克。其中有一箱每瓶都少50克,现在有一个自动秤,需要一个硬币才能秤,现在你只有一个硬币也就是只能称量一次,问如何找出每瓶少50克的那一箱?</div>
<div><br></div>
<div>这个题目想了半天也不知道如何答,结果留空了。</div>
<div>
<div class="quote_title">xanpeng 写道</div>
<div class="quote_div">第一题思路:第一个箱子取1瓶,第二个取2瓶,。。。,第10箱取10瓶<br>如果那箱没有少50克,则总共重800*(1+2+...+10) = 44000<br>实际有一箱每瓶是少50克的,实际称出重量y克<br>则有 44000 - y = x*50, x 就是第 x 个箱子,就是目标箱子</div>
</div>
<p><strong>polaris注:</strong> 当时没考虑拆箱拿出来。因为题目上说是一个工厂的人给一个公司送的10箱罐头,返回时,他老板打电话给他,说有一箱有问题,要他挑出来,我觉得是包装好了的,拆开不太行吧,都拆开,公司不愿意吧,所以觉得题目是不是有问题,没法解。看来还是得拆开。</p>
<h2>2、基础题<br>
</h2>
<h3>2.1 在一个平面中画999条线,最多可以分为多少部分。写出推导公式。<br>
</h3>
<div>见到此题的第一想法是:利用数学中的归纳法,根据1、2、3、4等条线时可分出的数量推导出公式。然而,这种方法证明比较麻烦。然后就想其他方法,当然就是找规律了,想到的是根据交点数来计算,不过这种方法试了一下,发现有点难度,似乎不可行。最后想来想去还是使用了归纳法,毕竟来的容易,只是没有写证明过程。<br>
</div>
<h3>2.2 什么是软件生命周期?有哪几个阶段?<br>
</h3>
<div>当时学软件工程的时候都记着的,这时候一下子忘记了。就胡乱写了几个。不过也大概对了。这样的题目感觉没多大意思,完全记忆性的。</div>
<div><br></div>
<div>
<strong>该题的答案(供参考):</strong> </div>
<div><br></div>
<div>软件生命周期(SDLC,软件生存周期)是软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,这种按时间分程的思想方法是软件工程中的一种思想原则,即按部就班、逐步推进,每个阶段都要有定义、工作、审查、形成文档以供交流或备查,以提高软件的质量。</div>
<div><br></div>
<div>软件生命周期(SDLC)的六个阶段</div>
<div><br></div>
<div>(1)问题的定义及规划。</div>
<div>此阶段是软件开发方与需求方共同讨论,主要确定软件的开发目标及其可行性。</div>
<div><br></div>
<div>(2)需求分析。</div>
<div>在确定软件开发可行的情况下,对软件需要实现的各个功能进行详细分析。需求分析阶段是一个很重要的阶段,这一阶段做得好,将为整个软件开发项目的成功打下良好的基础。"唯一不变的是变化本身",同样需求也是在整个软件开发过程中不断变化和深入的,因此我们必须制定需求变更计划来应付这种变化,以保护整个项目的顺利进行。</div>
<div><br></div>
<div>(3)软件设计。</div>
<div>此阶段主要根据需求分析的结果,对整个软件系统进行设计,如系统框架设计,数据库设计等等。软件设计一般分为总体设计和详细设计。好的软件设计将为软件程序编写打下良好的基础。</div>
<div><br></div>
<div>(4)程序编码。</div>
<div>此阶段是将软件设计的结果转换成计算机可运行的程序代码。在程序编码中必须要制定统一,符合标准的编写规范。以保证程序的可读性,易维护性,提高程序的运行效率。</div>
<div><br></div>
<div>(5)软件测试。</div>
<div>在软件设计完成后要经过严密的测试,以发现软件在整个设计过程中存在的问题并加以纠正。整个测试过程分单元测试、组装测试以及系统测试三个阶段进行。测试的方法主要有白盒测试和黑盒测试两种。在测试过程中需要建立详细的测试计划并严格按照测试计划进行测试,以减少测试的随意性。</div>
<div><br></div>
<div>(6)运行维护。</div>
<div>软件维护是软件生命周期中持续时间最长的阶段。在软件开发完成并投入使用后,由于多方面的原因,软件不能继续适应用户的要求。要延续软件的使用寿命,就必须对软件进行维护。软件的维护包括纠错性维护和改进性维护两个方面。 <br>
</div>
<h2>3、编程题<br>
</h2>
<div>
<strong>题目:</strong> 将正整数的阿拉伯钱数转换为中文形式,如1011→一千零一十一,输出。</div>
<div><br></div>
<div>题目要求最好编程实现,不会编程可以用文字说明。</div>
<div><br></div>
<div>这道题并不难,算法思路很多人应该都会,然而,要真正编程实现,且是用笔写出来,要做到很准确就有点难度。</div>
<div><br></div>
<div>polaris解该题的大概思路是:确定正整数的总位数,然后分别用10的多少次方去除和取模,取模的结果再进行除与取模。</div>
<div><br></div>
<div>这里面涉及到很多细节要考虑,比如:多个连续的0,亿、万位的零等。</div>
<div><br></div>
<div>下面是polaris回来在电脑上编写了一个完整的,写的不对或不好之处,请大家指正。大家有更好的可以拿出来一起讨论。</div>
</div>
<div><br></div>
<div>
<pre name="code" class="java">package com.polaris.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

/**
* 将正整数的阿拉伯钱数转换为中文形式,如1011→一千零一十一,输出。
* @author xuxinhua(polaris) <a href="http://www.beijixing001.com" target="_blank">http://www.beijixing001.com</a>



* 2010-09-18
* @version 1.0
*/
public class TranslateMoney {
        // 保存阿拉伯数字到中文的对应关系
        private static String[] chineseMapStr = {"零","一","二","三","四","五","六","七","八","九"};
       
        // 保存最后的输出结果
private static StringBuilder chinMoney = new StringBuilder();

// 多个0连续时,中文只需写出一个零。该变量用于标记是否为连续的0
private static int flag = 0;

public static void main(String[] args) throws Exception{
// 省略
}

/**
* 转换函数
* @param money
* @param digit
* @return
*/
public static String translate(int money, int digit) {

if(digit==1) {
// 如果个位是0,则忽略
if(money!=0){
// 得到数字的中文表示
String chinDigit = chineseMapStr[money];
chinMoney.append(chinDigit);
}
} else {

// 除数
int divisor = (int)Math.pow(10, digit-1);
// 商
int quotient = money / divisor;
// 余数
int remainder = money % divisor;

// 得到数字的中文表示
String chinDigit = chineseMapStr[quotient];

// 得到当前最高位的中文表示
String unit = "";

if(quotient!=0) {
// 得到当前最高位的中文表示
unit = getUnit(digit);
flag = 0;
} else {
// 如果亿、万为零,须特殊处理,零不说出,而保留亿或万,这时flag增加
if(digit==9 || digit==5) {
chinDigit = "";
unit = getUnit(digit);
} else {
++flag;
}
}

// 不止一个0
if(flag&gt;1) {
// 忽略该位,处理下一位
translate(remainder, digit-1);
} else {
// 如果是一十亿、一十万之类的,前面的“一”不要,这样更符合中文习惯
if(quotient==1) {
if(digit==6 || digit==10)
chinDigit = "";
}
chinMoney.append(chinDigit).append(unit);
translate(remainder, digit-1);
}
}

return chinMoney.toString();
}

/**
* 位数表示,如亿、万等
* @param digit
* @return
*/
private static String getUnit(int digit) {
String unit = null;

switch(digit) {
case 12:
case 8:
case 4:
unit = "千";
break;
case 11:
case 7:
case 3:
unit = "百";
break;
case 10:
case 6:
case 2:
unit = "十";
break;
case 9:
unit = "亿";
break;
case 5:
unit = "万";
break;
}

return unit;
}
}
</pre>
 <span style="font-size: 13px; line-height: 19px; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif;">下载完整的类文件:<a style="background-image: none; background-color: initial; padding: 0px; margin: 0px;" title="TranslateMoney.java" href="http://www.beijixing001.com/post/433.html" target="_blank">TranslateMoney.java</a> (在文章最后)</span> </div>
</div>
<p> </p>
38 楼 za3999 2010-09-19  
<pre name="code" class="java"> public static void main(String[] args) {
int n=1;
for (int i = 1; i &lt; 1000; i++) {
n += i;
}
System.out.println("最终:"+n);
}

最终:499501</pre>
<p> </p>
37 楼 polaris1119 2010-09-19  
<div class="quote_title">诸葛不亮 写道</div>
<div class="quote_div">
<div class="quote_title">
<br><br> <br><br> polaris1119 写道</div>
<div class="quote_div">
<div class="quote_title">yangkunlin 写道</div>
<div class="quote_div">基础题:通项公式为an = a(n-1)+n;a1=2;则a999=999001</div>
<br>关键这个是需要证明的。结果我想很多人都会。证明应该有点麻烦。</div>
<p><br><br>不知道这算不算:</p>
<p>解:<br>设当n条直线的时候,最多的面的个数为an。所以a1=2成立。<br>则:当n-1条直线的时候最多有a(n-1)个面。<br>现在再增加一条线,即n条线,两条直线只有两种关系,即相交,平行。<br>首先考虑第n条线与前面的(n-1)都相交的情况。</p>
<p>先看一个简单的例子:第四条直线与前三条都相交的情况,如下图:</p>
<p><img src="http://dl.iteye.com/upload/attachment/313321/31ea6e54-e88a-3603-9374-599cdc660db5.png" alt=""><br>第四条直线会增加4个区域。</p>
<p>现在考虑第n条与前(n-1)条都相交的情况:如下图:</p>
<p><img src="http://dl.iteye.com/upload/attachment/313324/826d2a4d-ca30-3383-86ab-bf7bedcbbe7a.png" alt=""></p>
<p>考虑到n-1条直线中间会(n-2)个区域。加上两边的2个区域,一共是n个区域(影印部分)。<br>所以an=a(n-1)+n</p>
<p>接着考虑与某一条直线平行的情况,可以这样考虑相交会比平行多处一个两条直线围成的区域。<br>所以平行不会产生最多的区域(可用反正法证明),这样也就证明了产生最多的面的情况是n条直线<br>两两相交。</p>
<p>最后讨论n条直线两两相交的可能性分析:如下图:</p>
<p><br><img src="http://dl.iteye.com/upload/attachment/313326/8b38ace8-0387-3dab-8767-ba1660579210.png" alt=""></p>
<p>考虑平面的无限性。我们可以用一个圆来模拟,这些直线是圆的半径。<br>设两条相邻直线之间的夹角为b,那么直线的条数最多为360/b。 考虑b趋向无穷小,则,条数最多是无</p>
<p>穷大。<br> 证毕。</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
</div>
<p>强悍……数学功底好强……</p>
36 楼 polaris1119 2010-09-19  
yangguo 写道


public class MoneyTrans {
	
	private static String[] ChinaDigit = {"零","一","二","三","四","五","六","七","八","九"};
	private static String[] UNIT = {"","","十","百","千"};
	private static String[] BIGUNIT = {"","万","亿"};
	
	private char[] digit;
	public String trans(int n){
		StringBuffer buff = new StringBuffer();
		digit = String.valueOf(n).toCharArray();
		int length = digit.length;		
		int pos = (length - 1)/4;
		int headLength = (length - 1)%4 + 1;		
		buff.append(partTrans(0,headLength) + BIGUNIT[pos--]);
		for (int i = headLength;i < length ; i = i + 4) {
			
			buff.append(partTrans(i , i + 4) +  BIGUNIT[pos--]) ;
		}
		return buff.toString();
	}
	
	private  String partTrans(int start, int end) {
		StringBuffer buff = new StringBuffer();
		boolean isPreDigitZero = false;
		for (int i = start; i < end; i++) {
			int cur = digit[i] - '0';
			if(cur != 0 ){
				if(isPreDigitZero == true){
					buff.append(ChinaDigit[0]);
				}
				buff.append(ChinaDigit[cur] + UNIT[end - i]);
				isPreDigitZero = false;
			}
			else {			
				isPreDigitZero = true;
			}			
		}		
		return buff.toString();		
	}

	public static void main(String[] args) {		
		MoneyTrans transtor = new MoneyTrans();
		String money = transtor.trans(23005602);
		System.out.println(money);
	}

}



仁兄的思路很好。只是代码没点注释,看着好累……呵呵
35 楼 诸葛不亮 2010-09-19  
<div class="quote_title">
<br><br> <br><br> polaris1119 写道</div>
<div class="quote_div">
<div class="quote_title">yangkunlin 写道</div>
<div class="quote_div">基础题:通项公式为an = a(n-1)+n;a1=2;则a999=999001</div>
<br>关键这个是需要证明的。结果我想很多人都会。证明应该有点麻烦。</div>
<p><br><br>不知道这算不算:</p>
<p>解:<br>设当n条直线的时候,最多的面的个数为an。所以a1=2成立。<br>则:当n-1条直线的时候最多有a(n-1)个面。<br>现在再增加一条线,即n条线,两条直线只有两种关系,即相交,平行。<br>首先考虑第n条线与前面的(n-1)都相交的情况。</p>
<p>先看一个简单的例子:第四条直线与前三条都相交的情况,如下图:</p>
<p><img src="http://dl.iteye.com/upload/attachment/313321/31ea6e54-e88a-3603-9374-599cdc660db5.png" alt=""><br>第四条直线会增加4个区域。</p>
<p>现在考虑第n条与前(n-1)条都相交的情况:如下图:</p>
<p><img src="http://dl.iteye.com/upload/attachment/313324/826d2a4d-ca30-3383-86ab-bf7bedcbbe7a.png" alt=""></p>
<p>考虑到n-1条直线中间会(n-2)个区域。加上两边的2个区域,一共是n个区域(影印部分)。<br>所以an=a(n-1)+n</p>
<p>接着考虑与某一条直线平行的情况,可以这样考虑相交会比平行多处一个两条直线围成的区域。<br>所以平行不会产生最多的区域(可用反正法证明),这样也就证明了产生最多的面的情况是n条直线<br>两两相交。</p>
<p>最后讨论n条直线两两相交的可能性分析:如下图:</p>
<p><br><img src="http://dl.iteye.com/upload/attachment/313326/8b38ace8-0387-3dab-8767-ba1660579210.png" alt=""><br> </p>
<p>考虑平面的无限性。我们可以用一个圆来模拟,这些直线是圆的半径。<br>设两条相邻直线之间的夹角为b,那么直线的条数最多为360/b。 考虑b趋向无穷小,则,条数最多是无</p>
<p>穷大。<br> 证毕。</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
34 楼 polaris1119 2010-09-19  
hackpro 写道
第一题:
条件:只能称一次,硬币只能用一次

称量方法:先把 10箱全部放在称上,然后按上硬币,使称可以使用,然后依次拿走物品,记下每次拿走物品时,称上显示的度量值。然后找到不同度量值时那次拿下的物品,这个就是少50克的那一箱..
第二题: 999条线,最多能组多少个部分:
       999 条线 认为有999*2个点
        一个部分 认为是一个平面, 那么一个平面至少有3个点 
   那么就可以用排列组算 C(999*2---3)的排列组合了
   排列组合是高中的知识,已经模糊了,让我在看看资料。

第一题你这样解似乎可以不拆开箱子。但这样算不算是一次称量就不知道了。
第二题,我当时也是考虑焦点的问题,也是乐排列组合,但是线条越多发现太复杂,没找出很好的规律。
33 楼 yfkscu 2010-09-19  



public class Main {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10000; i++)
show(i);
}

// #wan#qian#bai#shi#亿#qian#bai#shi#万#qian#bai#shi#
public static void show(int n) {
char[] table = new char[] { '零', '一', '二', '三', '四', '五', '六', '七',
'八', '九' };
String s = (new Integer(n)).toString();
char[] chars = "#万#千#百#十#亿#千#百#十#万#千#百#十#".toCharArray();

int len = s.length();
int index = chars.length - 1;
for (int i = len - 1; i >= 0; i--) {
while (chars[index] != '#')
index--;
chars[index] = table[s.charAt(i) - '0'];
}
for (int i = 0; i < chars.length - 1; i += 2) {
if (chars[i] == '#')
chars[i + 1] = '#';
if (chars[i] == '零' && chars[i + 1] != '万' && chars[i + 1] != '亿')
chars[i + 1] = '零';
}
if (chars[chars.length - 1] == '零')
chars[chars.length - 1] = '#';

StringBuffer sb = new StringBuffer();
char pre = ' ';
for (int i = 0; i < chars.length; i++) {
if (chars[i] != '#') {
if (pre == '零' && chars[i] != '零') {
pre = chars[i];
sb.append(chars[i]);
} else if (pre != '零') {
pre = chars[i];
sb.append(chars[i]);
}
}
}

int idx = sb.indexOf("亿");
if (idx != -1) {
if (sb.charAt(idx + 1) == '零')
sb.replace(idx + 1, idx + 3, "");

if (sb.charAt(idx - 1) == '零')
sb.replace(idx - 1, idx + 1, "");
} else {
idx = sb.indexOf("万");
if (idx != -1)
if (sb.charAt(idx - 1) == '零')
sb.replace(idx - 1, idx + 1, "");
}
if (sb.length() > 1 && sb.charAt(sb.length() - 1) == '零')
sb.replace(sb.length() - 1, sb.length(), "");
System.out.println(sb.toString());
}
}
32 楼 polaris1119 2010-09-19  
wjb_forward 写道
stupidmxx 写道
看到这段的时候,我就囧了

        chineseMap.put(0, "零"); 
//...
        chineseMap.put(9, "九"); 

您就不会String[] chineseMappingArray = {"零",...,"九"}; 么?


这不是的本题重点好不好,细节等有时间再优化。关键是解题思路


呵呵。
31 楼 wjb_forward 2010-09-19  
hackpro 写道
第一题:
条件:只能称一次,硬币只能用一次

称量方法:先把 10箱全部放在称上,然后按上硬币,使称可以使用,然后依次拿走物品,记下每次拿走物品时,称上显示的度量值。然后找到不同度量值时那次拿下的物品,这个就是少50克的那一箱..
第二题: 999条线,最多能组多少个部分:
       999 条线 认为有999*2个点
        一个部分 认为是一个平面, 那么一个平面至少有3个点 
   那么就可以用排列组算 C(999*2---3)的排列组合了
   排列组合是高中的知识,已经模糊了,让我在看看资料。


你拿走一瓶,称出来不一样的重量,就应该算称了两次了
30 楼 wjb_forward 2010-09-19  
stupidmxx 写道
看到这段的时候,我就囧了

        chineseMap.put(0, "零"); 
//...
        chineseMap.put(9, "九"); 

您就不会String[] chineseMappingArray = {"零",...,"九"}; 么?


这不是的本题重点好不好,细节等有时间再优化。关键是解题思路

相关推荐

    c++笔试题目--掌握了,去一般的笔试应该没问题了

    在准备C++的笔试时,了解并掌握以下几个关键知识点至关重要: 1. **基础语法**:C++的基础语法包括变量定义、数据类型(如int、float、char)、运算符(算术、比较、逻辑等)、流程控制(如if-else、switch-case、...

    百度2012校园招聘机器学习数据挖掘工程师(北京)笔试题目--绝对经典

    【标题】和【描述】提及的是百度2012年针对校园招聘的机器学习和数据挖掘工程师笔试题目,这些题目代表了当时企业对于这类工程师所需技能的要求和关注点。【标签】指出了“百度”和“笔试”,意味着这是百度公司进行...

    UC浏览器笔试-java笔试题目-职位客户端工程师,中间件工程师

    其次,对于中间件工程师,还需要关注以下几个关键知识点: 1. **网络编程**:HTTP、TCP/IP协议的理解,Socket编程的应用,以及如何处理网络通信中的各种问题。 2. **数据库操作**:SQL语句的编写,事务管理,索引...

    6.0笔试题2011-9-18.rar

    标题中的“6.0笔试题2011-9-18.rar”表明这是一个关于某个考试版本6.0的笔试题目集合,日期为2011年9月18日,文件格式为RAR,这是一种常见的压缩文件格式,用于存储和传输多个相关文件。RAR文件通常由WinRAR或其他...

    2006年利乐中国笔试题目-笔试题目文档八大题不带答案.docx

    2009 年复试笔试题目 题目是前八大题任选四个,每题 35 分,外加第九题专业英语翻译 60 分,总共 200 分 一、食品安全方向 (一) 五个选择题(10 分) (二) 与 HACCP 相比,ISO2000:2005 有何特点(10 分) (三) 一篇材料...

    百度往年实习生笔试题目

    - 可以结合两种方案的优点,比如在提问页面顶部简要展示几个最相关的已解决问题链接,同时提供一个“查看全部相似问题”的选项,以便用户根据自己的需要选择。 - 引入智能推荐系统,根据用户提问的关键字和上下文...

    千辛万苦收集的公司笔试题目

    几个公司的笔试题目,操,烦人烦人烦人,要说这么多

    三一重工笔试题目

    三一重工笔试题目所涉及的知识点可以归纳为以下几个方面: 1. 企业知识部分 三一重工在笔试的企业知识部分,会涉及公司使命、价值观、历史荣誉和员工成长机会等方面。例如,三一重工的使命是“品质改变世界”,核心...

    JAVA笔试题----------大唐软件

    在这份笔试题中,我们可以看到涵盖了Java基础知识、Java集合框架、多线程、异常机制、Java ClassLoader、MVC模式、JSP、Struts、EJB、设计模式、XML解析和Open Source项目等多个方面的知识点。 1. JAVA基础知识: ...

    百度笔试题---数据库

    在本文中,我们将深入探讨数据库相关知识,特别是针对百度笔试题中的几个SQL查询和数据库优化策略。首先,我们来看题目提供的关系模式: User(userId, userName) - 用户关系,包含用户ID和用户名。 Article...

    QT C++ 笔试题目 京东

    这份笔试题目可能涵盖以下几个关键知识点: 1. **QT基础知识**:包括QT的基本架构、核心类库、信号与槽机制、事件处理等。考生需要理解QT对象模型,知道如何创建和管理窗口、控件,并能熟练运用信号与槽进行对象间...

    工作资料——阿里巴巴笔试题目

    阿里巴巴的笔试题目通常涵盖以下几个方面: 1. **编程能力**:阿里巴巴作为一家技术驱动的公司,对编程基础有较高的要求。可能会涉及C++、Java、Python等主流编程语言的语法、数据结构(如链表、树、图)、算法...

    Java笔试题目汇总122题

    Java内存模型主要包括以下几个部分: - **堆**:所有对象实例都存储在这里。 - **栈**:每个线程拥有自己的栈,用于存储局部变量等。 - **方法区**:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器...

    硬件测试笔试题V1-(附答案).docx

    【硬件测试笔试题V1-(附答案).docx】是一份针对硬件测试工程师的笔试题目,涵盖了许多关于硬件测试、电子工程和计算机硬件的基础知识。以下是根据提供的部分内容解析的几个关键知识点: 1. **错误发现与残留错误的...

    迈瑞软开笔试题目

    首先,软件开发笔试通常涵盖以下几个方面: 1. **编程基础**:笔试可能包含C、C++、Java或Python等主流编程语言的基础知识,如语法、数据类型、控制结构、函数、异常处理等。熟悉这些语言的基本概念和用法是必不可...

    IT笔试面试--红黑树详细解析,代码+图解

    插入操作可以概括为以下几个步骤: 1. 查找要插入的位置,时间复杂度为:O(N) 2. 将新节点的 color 赋为红色 3. 自下而上重新调整该树为红黑树 其中,第(1)步的查找方法跟普通二叉查找树一样,第(2)步之所以将...

    C++ 笔试题 google 微软 华为 索尼 中兴 大唐 各种C++笔试题目

    微创笔试题目(微创,微软在中国的合资公司) Intel笔试面试题目 IBM 社会招聘笔试题 宝洁公司(P&G)面试题目 飞利浦笔试试题 阿尔卡特(中国)的面试题目 Google 戴尔 意法半导体软件试题 Sony笔试题 华为笔试题 ...

    华为笔试机试2011--14年汇总

    在准备华为笔试机试时,以下几个核心知识点至关重要: 1. **编程语言基础**:华为笔试通常涵盖C、C++、Java、Python等主流编程语言,考生需熟练掌握语法、数据类型、控制结构、函数使用等基本概念。 2. **算法与...

    腾讯笔试题目2010,2013

    接下来,2013腾讯实习生招聘笔试题目.docx,我们可以推测这个文档同样会包含上述几类题目,但题目难度和侧重点可能会有所变化,反映出腾讯对当年实习生技能需求的更新。例如,随着大数据和云计算的发展,面试官可能...

Global site tag (gtag.js) - Google Analytics