- 浏览: 130766 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
Mr_sqw:
bonny 写道这个问题我大 ...
用if、Exception还是assert? ——看JavaEye论坛帖子:《面试题:用Exception异常还是if判断》的感想 -
Mr_sqw:
IcedCoffee 写道awfe 写道Checked Exc ...
用if、Exception还是assert? ——看JavaEye论坛帖子:《面试题:用Exception异常还是if判断》的感想 -
jinianjun:
表示感谢!@
CSS选择器、优先级与匹配原理 -
yuming805796:
986065785@qq.com
jQuery学习之:jqGrid表格插件——从Struts2获得数据 -
yuming805796:
你好,能共享下吗,代码没分页功能,,少了点东西!
jQuery学习之:jqGrid表格插件——从Struts2获得数据
感谢大家,一些问题经过大家讨论变得很明朗。谢谢!对大家一些回复进行了一个小结,大家可以点击此处查看。
今天去一家公司参加笔试,其中有几个题目觉得做的不是太好,拿出来与大家讨论。
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 个箱子,就是目标箱子
如果那箱没有少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 (在文章最后)
评论
69 楼
Roshan2
2010-09-24
http://www.iteye.com/topic/770328
68 楼
g岩岩
2010-09-24
有难度呀!!!!!!!!
67 楼
yearh
2010-09-24
用了递归解也行
public class Test { private static String[] digit = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十" }; private static String[] unit = { "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "万", "兆", "十", "百", "千", "万", "亿" }; private static String convertInner(String money) { int length = money.length(); int curNum = money.charAt(0) - '0'; String result = ""; if (length > 1) { String curUnit = unit[length - 2]; result = convertInner(money.substring(1, length)); if (curNum == 0) { if (money.charAt(1) != '0' && "万亿兆".indexOf(curUnit) == -1) result = "零" + result; else if ("万亿兆".indexOf(curUnit) != -1) result = curUnit + result; } else result = digit[curNum - 1] + curUnit + result; } else if (curNum != 0) result = digit[curNum - 1]; return result; } public static String convert(String money) { String result = convertInner(money).replaceAll("亿万", "亿").replaceAll("兆万", "兆") .replaceAll("兆亿", "兆").replaceAll("一十", "十"); return result.equals("") ? "零" : result; } public static void main(String[] args) { String result = ""; String[] money = { "900000000020300" }; String[] rightResult = { "九十兆零二万零三百" }; for (int i = 0; i < money.length; i++) { result = convert(money[i]); System.out.println("[" + result.equals(rightResult[i]) + "] money = " + money[i] + ", result = " + result); } } }
66 楼
Wade_songww
2010-09-23
那个编程题没看明白 有人帮忙解释下么?
65 楼
manyhf16
2010-09-21
利用中午的时间写了一下,主要使用了正则表达式和BigDecimal中一些方法,效率没有考虑,但自认为代码还是比较易懂的. 大家帮忙检查下,看有没有问题
import java.math.BigDecimal; public class TestMoney { public static final String[] ms = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; public static final String[] ds = {"圆","拾", "佰", "仟", "万", "拾", "佰", "仟", "亿","拾", "佰", "仟", "兆","拾", "佰", "仟"}; public static final String[] xs = {"角","分"}; /** * * @param money 考虑到整数太小,使用了BigDecimal,本来字符串也可以,但懒的再改了 * @param useZhao 是否以兆为单位,true 表示单位为'兆' false表示'兆'将以'万亿'表示 * @return */ public static String convert(BigDecimal money, boolean useZhao) { // 转换小数部分 BigDecimal xiao = money.subtract(money.setScale(0,BigDecimal.ROUND_DOWN)); boolean isXiao = !xiao.equals(BigDecimal.ZERO); StringBuilder sb3 = new StringBuilder(); String xiaoStr = ""; if(isXiao) { int i = 0; do { xiao = xiao.multiply(BigDecimal.TEN); sb3.append(ms[xiao.setScale(0, BigDecimal.ROUND_DOWN).intValue()]); sb3.append(xs[i]); i++; xiao = xiao.subtract(xiao.setScale(0,BigDecimal.ROUND_DOWN)); } while(i < xs.length); xiaoStr = sb3.toString() .replaceAll("(零[^角分])+", "零") .replaceAll("(零[角分])+$", ""); } // 转换整数部分 StringBuilder sb1 = new StringBuilder(); do { BigDecimal[] s = money.divideAndRemainder(BigDecimal.TEN); sb1.append(ms[s[1].intValue()]); money = s[0]; } while(money.compareTo(BigDecimal.ZERO) > 0); StringBuilder sb2 = new StringBuilder(); for (int i = 0; i < sb1.length(); i++) { sb2.append(ds[i]).append(sb1.charAt(i)); } String tmp = sb2.reverse() .append((xiaoStr.length()>0)?xiaoStr:"整") //中间有'零佰','零仟'的都替换为'零' .toString().replaceAll("(零[^亿万圆])+", "零") //中间有'零亿', '零零亿','零零万','零零元'的都替换掉零,不包括兆|亿|万|圆 //等价于下面注释的四句 .replaceAll("(零+)(?=兆|亿|万|圆)", "") // .replaceAll("零+兆", "兆") // .replaceAll("零+亿", "亿") // .replaceAll("零+万", "万") // .replaceAll("零+圆", "圆") .replaceAll("亿万", "亿") .replaceAll("兆亿", "兆") .replaceAll("壹拾", "拾") ; // 按楼主说的,更符合习惯 tmp = (useZhao)?tmp:tmp.replaceAll("兆", "万亿"); System.out.println(tmp); return tmp; } public static void main(String[] args) { TestMoney.convert(new BigDecimal("1020.02"),true); TestMoney.convert(new BigDecimal("1020.00"),true); TestMoney.convert(new BigDecimal("1020.30"),true); TestMoney.convert(new BigDecimal("1020.44"),true); TestMoney.convert(new BigDecimal("109000"),true); TestMoney.convert(new BigDecimal("1234123456789"),true); TestMoney.convert(new BigDecimal("1234123456789"),false); TestMoney.convert(new BigDecimal("1010000100010"),true); TestMoney.convert(new BigDecimal("1010000100010"),false); TestMoney.convert(new BigDecimal("1000000000000"),true); TestMoney.convert(new BigDecimal("1000000000000"),false); TestMoney.convert(new BigDecimal("903003000000000"),false); TestMoney.convert(new BigDecimal("903003000000000"),true); } }
64 楼
yangguo
2010-09-21
polaris1119 写道
呵呵。看样子还是我那种最古老的实现方式比较可靠。呵呵。
200000000这么多0还真没有考虑到。呵呵。
你的比较低效,也不好扩展的。
扩展到更高位就体现出优势了。
package com.test; public class MoneyTrans { private static String[] ChinaDigit = {"零","一","二","三","四","五","六","七","八","九"}; private static String[] UNIT = {"","","十","百","千"}; private static String[] BIGUNIT = {"","万","亿","兆"}; private static long MAX = 10000000000000000L - 1; private char[] digit; public String trans(long n) throws Exception{ if(n > MAX){ throw new Exception("数字过大,最多可处理到千兆位"); } StringBuffer buff = new StringBuffer(); boolean isPrePartZero = false; digit = String.valueOf(n).toCharArray(); int length = digit.length; int pos = (length - 1)/4; int headLength = (length - 1)%4 + 1; // xxxxxxxxxx --> xx|xxxx|xxxx buff.append(partTrans(0,headLength) + BIGUNIT[pos--]); for (int i = headLength;i < length ; i = i + 4) { String part = partTrans(i , i + 4); if(part.length() == 0){ isPrePartZero = true; }else{ if(isPrePartZero && !part.startsWith(ChinaDigit[0])){ buff.append(ChinaDigit[0]); } buff.append(part + BIGUNIT[pos]) ; isPrePartZero = false; } 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){ 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) throws Exception { MoneyTrans transtor = new MoneyTrans(); String test1 = transtor.trans(9000000000000000L); String test2 = transtor.trans(9000000000000001L); System.out.println(test1); System.out.println(test2); } }
63 楼
polaris1119
2010-09-21
a881127b 写道
你钱数转换为中文的程序有个很大的错误:
你的标记Flag用的static变量,要是程序中多次调用这个转换类的话怎么办??
一个测试用例:
结果:
你的标记Flag用的static变量,要是程序中多次调用这个转换类的话怎么办??
一个测试用例:
public static void main(String[] args) throws Exception{ // 省略 System.out.println(translate(1234,4)); System.out.println(translate(1234,4)); }
结果:
一千二百三十四 一千二百三十四一千二百三十四
哦,谢谢提醒,写的时候没有考虑这种问题,还有多线程问题也没有考虑,当时只考虑实现功能。
62 楼
polaris1119
2010-09-21
yangguo 写道
针对你提的bug,修正如下:
你改的方案过不了: 200000000
public String trans(int n){ StringBuffer buff = new StringBuffer(); boolean isPrePartZero = false; digit = String.valueOf(n).toCharArray(); int length = digit.length; int pos = (length - 1)/4; int headLength = (length - 1)%4 + 1; // xxxxxxxxxx --> xx|xxxx|xxxx buff.append(partTrans(0,headLength) + BIGUNIT[pos--]); for (int i = headLength;i < length ; i = i + 4) { String part = partTrans(i , i + 4); if(part.length() == 0){ isPrePartZero = true; }else{ if(isPrePartZero && !part.startsWith(ChinaDigit[0])){ buff.append(ChinaDigit[0]); } buff.append(part + BIGUNIT[pos]) ; isPrePartZero = false; } pos--; } return buff.toString(); }
你改的方案过不了: 200000000
呵呵。看样子还是我那种最古老的实现方式比较可靠。呵呵。
200000000这么多0还真没有考虑到。呵呵。
61 楼
polaris1119
2010-09-21
夜如此的寒 写道
根据楼主的需求,加了个判断:
输出结果:一百零二万三千二百零一
public class Test { public static String translateMoney(int money) { String total = "";//返回的字符串 String[] Money = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; String[] Util = {" ","十", "百", "千", "万", "十", "百", "千", "亿"}; String strMoney = String.valueOf(money);//参数转字符串 String[] inMoney =strMoney.toString().trim().split("");//参数转存到数组里 for(int i=0;i<strMoney.length();i++){ if(Integer.parseInt(inMoney[1+i])==0){ total=total+Money[Integer.parseInt(inMoney[1+i])]; }else{ total=total+Money[Integer.parseInt(inMoney[1+i])]+Util[strMoney.length()-i-1]; } } total = total.toString().trim(); return total; } public static void main(String[] args) { System.out.println(translateMoney(1023201)); } }
输出结果:一百零二万三千二百零一
兄弟,你这个不行啊。考虑问题要周到些。呵呵。多个0在一起呢?比如10023201,测试又有问题了,结果输出:一千零零二万三千二百零一
60 楼
夜如此的寒
2010-09-21
根据楼主的需求,加了个判断:
输出结果:一亿零二万三千二百零一
继续修改
public class Test { public static String translateMoney(int money) { String total = "";//返回的字符串 String[] Money = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; String[] Util = {" ","十", "百", "千", "万", "十", "百", "千", "亿"}; String strMoney = String.valueOf(money);//参数转字符串 String[] inMoney =strMoney.toString().trim().split("");//参数转存到数组里 boolean flg = true; for(int i=0;i<strMoney.length();i++){ if(Integer.parseInt(inMoney[1+i])==0){ if(flg){ total=total+Money[Integer.parseInt(inMoney[1+i])]; flg = false; } }else{ total=total+Money[Integer.parseInt(inMoney[1+i])]+Util[strMoney.length()-i-1]; flg = true; } } total = total.toString().trim(); return total; } public static void main(String[] args) { System.out.println(translateMoney(100023201)); } }
输出结果:一亿零二万三千二百零一
继续修改
59 楼
a881127b
2010-09-21
你钱数转换为中文的程序有个很大的错误:
你的标记Flag用的static变量,要是程序中多次调用这个转换类的话怎么办??
一个测试用例:
结果:
你的标记Flag用的static变量,要是程序中多次调用这个转换类的话怎么办??
一个测试用例:
public static void main(String[] args) throws Exception{ // 省略 System.out.println(translate(1234,4)); System.out.println(translate(1234,4)); }
结果:
一千二百三十四 一千二百三十四一千二百三十四
58 楼
yangguo
2010-09-21
针对你提的bug,修正如下:
你改的方案过不了: 200000000
public String trans(int n){ StringBuffer buff = new StringBuffer(); boolean isPrePartZero = false; digit = String.valueOf(n).toCharArray(); int length = digit.length; int pos = (length - 1)/4; int headLength = (length - 1)%4 + 1; // xxxxxxxxxx --> xx|xxxx|xxxx buff.append(partTrans(0,headLength) + BIGUNIT[pos--]); for (int i = headLength;i < length ; i = i + 4) { String part = partTrans(i , i + 4); if(part.length() == 0){ isPrePartZero = true; }else{ if(isPrePartZero && !part.startsWith(ChinaDigit[0])){ buff.append(ChinaDigit[0]); } buff.append(part + BIGUNIT[pos]) ; isPrePartZero = false; } pos--; } return buff.toString(); }
你改的方案过不了: 200000000
57 楼
polaris1119
2010-09-20
夜如此的寒 写道
小弟献丑了:20行代码。粗粗的写了一下。。别骂我
运行结果:九亿九千九百九十九万九千九百九十九
public class Test { public static String translateMoney(int money) { String total = "";//返回的字符串 String[] Money = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; String[] Util = { " ","十", "百", "千", "万", "十", "百", "千", "亿"}; String strMoney = String.valueOf(money);//参数转字符串 String[] inMoney =strMoney.toString().trim().split("");//参数转存到数组里 for(int i=0;i<strMoney.length();i++){ total=total+Money[Integer.parseInt(inMoney[1+i])]+Util[strMoney.length()-i-1]; } return total; } public static void main(String[] args) { System.out.println(translateMoney(999999999)); } }
运行结果:九亿九千九百九十九万九千九百九十九
呵呵。你这个太粗糙了。测试用例更粗糙。这个主要要考虑0的问题,测试数字中一个0也没有。我随便拿一个带0的就出问题了。1023201,输出:一百零十二万三千二百零十一
56 楼
konnin
2010-09-20
luobin23628 写道
public class NumberToChinese { private static final String[] genericUnit = {"","十","百","千","万","十","百","千","亿","十","百","千","兆","十兆","百兆","千兆"}; private static final String[] numberic = {"零","一","二","三","四","五","六","七","八","九"}; public static String tranform(String number){ StringBuffer buffer = new StringBuffer(); int len = number.length(); for(int i=0; i<len; i++){ int n = Integer.parseInt(number.substring(i,i+1)); if(n==0){ if(!buffer.toString().endsWith(numberic[0])){ buffer.append(numberic[n]); } }else{ buffer.append(numberic[n]); buffer.append(genericUnit[len-i-1]); } } return normalize(buffer.toString()); } private static String normalize(String s){ return s.replaceAll("^"+numberic[0]+"*(.*?)"+numberic[0]+"*$", "$1"); } public static void main(String[] args) { System.out.println(tranform("0006560000000"));; } }
这个还是有点问题哦,比如用800098测试,结果却是八十零九十八,我还在研究,呵呵,刚刚看到
55 楼
夜如此的寒
2010-09-20
小弟献丑了:20行代码。粗粗的写了一下。。别骂我
运行结果:九亿九千九百九十九万九千九百九十九
public class Test { public static String translateMoney(int money) { String total = "";//返回的字符串 String[] Money = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; String[] Util = { " ","十", "百", "千", "万", "十", "百", "千", "亿"}; String strMoney = String.valueOf(money);//参数转字符串 String[] inMoney =strMoney.toString().trim().split("");//参数转存到数组里 for(int i=0;i<strMoney.length();i++){ total=total+Money[Integer.parseInt(inMoney[1+i])]+Util[strMoney.length()-i-1]; } return total; } public static void main(String[] args) { System.out.println(translateMoney(999999999)); } }
运行结果:九亿九千九百九十九万九千九百九十九
54 楼
luobin23628
2010-09-20
public class NumberToChinese { private static final String[] genericUnit = {"","十","百","千","万","十","百","千","亿","十","百","千","兆","十兆","百兆","千兆"}; private static final String[] numberic = {"零","一","二","三","四","五","六","七","八","九"}; public static String tranform(String number){ StringBuffer buffer = new StringBuffer(); int len = number.length(); for(int i=0; i<len; i++){ int n = Integer.parseInt(number.substring(i,i+1)); if(n==0){ if(!buffer.toString().endsWith(numberic[0])){ buffer.append(numberic[n]); } }else{ buffer.append(numberic[n]); buffer.append(genericUnit[len-i-1]); } } return normalize(buffer.toString()); } private static String normalize(String s){ return s.replaceAll("^"+numberic[0]+"*(.*?)"+numberic[0]+"*$", "$1"); } public static void main(String[] args) { System.out.println(tranform("0006560000000"));; } }
53 楼
luobin23628
2010-09-20
public class NumberToChinese {
private static final String[] genericUnit = {"","十","百","千","万","十","百","千","亿","十","百","千","兆","十兆","百兆","千兆"};
private static final String[] numberic = {"零","一","二","三","四","五","六","七","八","九"};
public static String tranform(String number){
StringBuffer buffer = new StringBuffer();
int len = number.length();
for(int i=0; i<len; i++){
int n = Integer.parseInt(number.substring(i,i+1));
if(n==0){
if(!buffer.toString().endsWith(numberic[0])){
buffer.append(numberic[n]);
}
}else{
buffer.append(numberic[n]);
buffer.append(genericUnit[len-i-1]);
}
}
return normalize(buffer.toString());
}
private static String normalize(String s){
return s.replaceAll("^"+numberic[0]+"*(.*?)"+numberic[0]+"*$", "$1");
}
public static void main(String[] args) {
System.out.println(tranform("0006560000000"));;
}
}
52 楼
yangguo
2010-09-20
呵呵,注释加的不错。
51 楼
laolinshi
2010-09-20
小弟也来献丑了,下面是编程题的代码,望各位DX赐教,谢谢!
public class ConvertToChiness { private static String[] chineseMapStr = {"零","一","二","三","四","五","六","七","八","九"}; private static String[] specailStr0 = {"千","百","十"}; private static String[] specailStr1 = {"亿","万"}; public static void main(String[] args){ System.out.println(convert("2512359321")); } private static String convert(String numberStr){ StringBuffer buffer=new StringBuffer(); List<String> list=new ArrayList<String>(); for(int i=0,j=numberStr.length();i<numberStr.length();i++,j--){ int num=Integer.parseInt(numberStr.substring(i,i+1)); String chinessNum=chineseMapStr[num]; String unit=getUnit(j); if(chinessNum.equals("零")){ if(!list.isEmpty()){ String chinessNumInList=list.get(list.size()-1); if(chinessNumInList.equals("零")){ list.remove(list.size()-1); } } } list.add(chinessNum); if(!StringUtils.isEmpty(unit)){ if(chinessNum.equals("零")){ if(ArrayUtils.contains(specailStr0, unit)){ }else if(ArrayUtils.contains(specailStr1, unit)){ list.remove(list.size()-1); list.add(unit); } }else{ list.add(unit); } } } for(String num:list){ buffer.append(num); } return buffer.toString(); } /** * 位数表示,如亿、万等 * @param digit * @return */ private static String getUnit(int digit) { String unit = ""; 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; } }
50 楼
polaris1119
2010-09-20
beipiaoonline 写道
第一题这样行不行:
十箱一块称,然后一箱一箱的往下拿,因为除了一箱少的,其余的都是一样重的
十箱一块称,然后一箱一箱的往下拿,因为除了一箱少的,其余的都是一样重的
你这样相当于称了很多次吧
发表评论
-
深入理解String——之前六个题目答案解析
2010-10-20 14:51 1102此前polaris给出了六道关于String的题目,本来没有打 ... -
Struts2 Error filterStart异常的解决方法总结
2010-09-27 01:00 1407今天一位网友让polaris帮忙解决一些jqGrid的问 ... -
用if、Exception还是assert? ——看JavaEye论坛帖子:《面试题:用Exception异常还是if判断》的感想
2010-08-25 23:31 2449用if、Exception还是assert? ... -
《Java并发编程实践》学习笔记之二:线程安全性(thread-safe)
2010-08-24 13:11 3288《Java并发编程实践 ... -
《Java并发编程实践》学习笔记之一:基础知识
2010-08-20 23:44 950《Java并发编程实践 ... -
Java环境变量配置问题
2010-08-14 13:17 1140昨晚在写《第三篇 打造 ... -
第二篇 多线程的使用——中断线程详解(Interrupt)
2010-08-11 15:50 2497在上篇文章《多线程的使用——Thread类和Runnab ... -
第一篇 多线程的使用——Thread类和Runnable接口
2010-08-10 16:19 1570进行并发程序设计,首先必须对多线程有足够的了解。在JAV ... -
JAVA并发程序设计序列文章
2010-08-10 16:15 987在程序设计中,很多时候都会涉及到并发性问题。在一般的操作 ... -
Struts2中转换Date类型的问题
2010-05-14 10:36 1388好久没有写Blog了,最近 ... -
【转】java反射与内省(Introspector)
2010-02-02 21:22 888一、java反射机制 JAVA反射机制是在运行状态中 ... -
【转】Java EE 6数据验证新框架:Bean验证
2010-01-14 21:17 1014【51CTO精选译文】对于Sun最新发布的Java EE 6平 ... -
【转】面向Java EE 6平台的上下文和依赖性注入
2010-01-14 21:16 1125【51CTO精选译文】Java EE 6平台的发布带来了几个新 ... -
【转】Java EE 6引入的三大新技术之JAX-RS
2010-01-12 22:50 1208【51CTO精选译文】上周我们介绍了Java EE 6平台的主 ... -
【转】Java EE 6总览:平台的主要目标
2010-01-06 19:58 888【51CTO精选译文】Java EE ...
相关推荐
几个公司的笔试题目,操,烦人烦人烦人,要说这么多
微创笔试题目(微创,微软在中国的合资公司) Intel笔试面试题目 IBM 社会招聘笔试题 宝洁公司(P&G)面试题目 飞利浦笔试试题 阿尔卡特(中国)的面试题目 Google 戴尔 意法半导体软件试题 Sony笔试题 华为笔试题 ...
近几年科大讯飞软件笔试题目,大概是09-13年的,很难得,比较全
java面试和笔试题目里面包含了十几家公司的面试和笔试的题目,涉及了J2EE相关的技术。是一个不错的面试和笔试题目的集合。
西安立辰远景JAVA笔试题目rllab 不再处于积极开发阶段,但来自几所大学的一个已经采用了它,现在以 的名义维护它。 我们建议您开发新项目,并将旧项目重新构建到积极维护的代码库上,以促进 RL 研究中的可重复性和...
很好的题目 很经典 1 用预处理指令#define 声明一个常数 用以表明1年中有多少秒(忽略闰年问题) #define SECONDS PER YEAR 60 60 24 365 UL 我在这想看到几件事情:
全都是几本模电数电信号单片机题目 1.用与非门等设计全加法器 2.给出两个门电路让你分析异同 3.名词:sram,ssram,sdram 4.信号与系统:在时域与频域关系 5.信号与系统:和4题差不多 6.晶体振荡器,好像是给出振荡频率...
电气自动化专业面试笔试_电力系统几个常见基础知识问答,很不错的
这个和你具体选择的方向关系不大,主要分研发,测试,基础研究等几个方向。面试官以提问+代码相结合。问题有:自我介绍,项目介绍,这两个是必须的,在介绍项目的时候,面试官会深入问问题,会对某些细节,例如数据...
java实习生笔试题目使用 Swift 和 Metal 进行并行计算 它写于 2016-02-08,并发布在我的 jekyll 网站上。 由于我已经停用了我的 jekyll 站点,因此最好在此处保留一份副本。 在 4 周的兼职工作中,在 Swift/Metal 零...
css常见单位rpx、px、em、rem、%、vh、vw的区别,垂直居中水平居中,利用css构建三角形(正三角,倒三角,左/右三角),响应式布局的方式,几种,媒体查询原理,flex布局,父相子绝,css常见单位rpx、px、em、rem、%...
阿里巴巴2010校园招聘笔试试卷 阿里巴巴公司启动2010年校园招聘行动。阿里巴巴集团日前启动了公司历史上最大规模校园招聘行动,计划今年招收应届毕业生1800名,其中技术类岗位占招聘职位的半数以上。 公司所在地...
1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情:
~$va工程师面试题大全-100%公司笔试题你都能碰到几个.docx
几个搜狗招聘笔试题,有时间看一下吧。题目不多,但是每天都看几个,积少成多了。
本电子书收集了100个真题,包括了百度、金山、微软、Intel等几十个企业的笔试和面试真题,部分附有答案,机会是留给有准备的人的,希望大家能从中得到启发。
微软笔试题目 软件测试 1立方体,每面涂上红或蓝,从n个中取出多少个会出现两个一样的立方体? 21-1024号灯,从左到右交叉打开关着的灯,然后从右到左 交叉打开关着的灯,然后又从左到右,再然后......hehe,不说...
这是统计的最新的mysql笔试题,总共有四十几个问题,答案也在对应的问题下边,只要用心看完,相信你会有所提升。
有几个NEC笔试题目,拿来和大家分享一下,主要是软件压力测试中的几个智力题
题目软件华邦笔试题目(大意)软件方面的软件测试若有遗漏、错误请指正。共15道题目。考了几道网络、硬件,之后有三道编译题目。... 2、ping用了什么协议 3、Tcp/ip的协议栈 4、dhcp功能 5、pc机bios有哪几个模块 6