锁定老帖子 主题:几个笔试题目(2010-09-18)
精华帖 (1) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-19
stupidmxx 写道 看到这段的时候,我就囧了
chineseMap.put(0, "零"); //... chineseMap.put(9, "九"); 您就不会String[] chineseMappingArray = {"零",...,"九"}; 么? 这不是的本题重点好不好,细节等有时间再优化。关键是解题思路 |
|
返回顶楼 | |
发表时间:2010-09-19
最后修改:2010-09-19
hackpro 写道 第一题:
条件:只能称一次,硬币只能用一次 称量方法:先把 10箱全部放在称上,然后按上硬币,使称可以使用,然后依次拿走物品,记下每次拿走物品时,称上显示的度量值。然后找到不同度量值时那次拿下的物品,这个就是少50克的那一箱.. 第二题: 999条线,最多能组多少个部分: 999 条线 认为有999*2个点 一个部分 认为是一个平面, 那么一个平面至少有3个点 那么就可以用排列组算 C(999*2---3)的排列组合了 排列组合是高中的知识,已经模糊了,让我在看看资料。 你拿走一瓶,称出来不一样的重量,就应该算称了两次了 |
|
返回顶楼 | |
发表时间:2010-09-19
wjb_forward 写道 stupidmxx 写道 看到这段的时候,我就囧了 chineseMap.put(0, "零"); //... chineseMap.put(9, "九"); 您就不会String[] chineseMappingArray = {"零",...,"九"}; 么? 这不是的本题重点好不好,细节等有时间再优化。关键是解题思路 呵呵。 |
|
返回顶楼 | |
发表时间: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()); } } |
|
返回顶楼 | |
发表时间:2010-09-19
hackpro 写道 第一题: 条件:只能称一次,硬币只能用一次 称量方法:先把 10箱全部放在称上,然后按上硬币,使称可以使用,然后依次拿走物品,记下每次拿走物品时,称上显示的度量值。然后找到不同度量值时那次拿下的物品,这个就是少50克的那一箱.. 第二题: 999条线,最多能组多少个部分: 999 条线 认为有999*2个点 一个部分 认为是一个平面, 那么一个平面至少有3个点 那么就可以用排列组算 C(999*2---3)的排列组合了 排列组合是高中的知识,已经模糊了,让我在看看资料。 第一题你这样解似乎可以不拆开箱子。但这样算不算是一次称量就不知道了。 第二题,我当时也是考虑焦点的问题,也是乐排列组合,但是线条越多发现太复杂,没找出很好的规律。 |
|
返回顶楼 | |
发表时间:2010-09-19
polaris1119 写道 yangkunlin 写道
基础题:通项公式为an = a(n-1)+n;a1=2;则a999=999001
关键这个是需要证明的。结果我想很多人都会。证明应该有点麻烦。
解: 先看一个简单的例子:第四条直线与前三条都相交的情况,如下图:
现在考虑第n条与前(n-1)条都相交的情况:如下图: 考虑到n-1条直线中间会(n-2)个区域。加上两边的2个区域,一共是n个区域(影印部分)。 接着考虑与某一条直线平行的情况,可以这样考虑相交会比平行多处一个两条直线围成的区域。 最后讨论n条直线两两相交的可能性分析:如下图:
考虑平面的无限性。我们可以用一个圆来模拟,这些直线是圆的半径。 穷大。
|
|
返回顶楼 | |
发表时间: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); } } 仁兄的思路很好。只是代码没点注释,看着好累……呵呵 |
|
返回顶楼 | |
发表时间:2010-09-19
诸葛不亮 写道
polaris1119 写道 yangkunlin 写道
基础题:通项公式为an = a(n-1)+n;a1=2;则a999=999001
关键这个是需要证明的。结果我想很多人都会。证明应该有点麻烦。
解: 先看一个简单的例子:第四条直线与前三条都相交的情况,如下图:
现在考虑第n条与前(n-1)条都相交的情况:如下图: 考虑到n-1条直线中间会(n-2)个区域。加上两边的2个区域,一共是n个区域(影印部分)。 接着考虑与某一条直线平行的情况,可以这样考虑相交会比平行多处一个两条直线围成的区域。 最后讨论n条直线两两相交的可能性分析:如下图: 考虑平面的无限性。我们可以用一个圆来模拟,这些直线是圆的半径。 穷大。
强悍……数学功底好强…… |
|
返回顶楼 | |
发表时间:2010-09-19
public static void main(String[] args) { int n=1; for (int i = 1; i < 1000; i++) { n += i; } System.out.println("最终:"+n); } 最终:499501
|
|
返回顶楼 | |
发表时间:2010-09-19
polaris1119 写道
感谢大家,一些问题经过大家讨论变得很明朗。谢谢!
今天去一家公司参加笔试,其中有几个题目觉得做的不是太好,拿出来与大家讨论。
1、智力题
|
|
返回顶楼 | |