锁定老帖子 主题:公司笔试算法题
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (3)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-09
这个是非常传统的题目了 哈哈
网上有很多种做法 最简单的是: 循环122345 到 543221 对于每次循环,取出每位数字,按条件逐个筛选即可 |
|
返回顶楼 | |
发表时间:2011-03-10
AllenZhang 写道 现在小朋友思想这么复杂干啥。10分钟的题目么。
遍历122345到543221之间的整数,剔除不符合的就行了。 被鄙视了... |
|
返回顶楼 | |
发表时间:2011-03-10
最后修改:2011-03-11
楼主可能想复杂了 !~~
其实在十分钟内要我分析 第一。数组的范围122345 ---- 543221 之间 第二、 将数据转换成String的类型,因为int型的数组少很多方法,用String进行处理比较方便 我的代码如下: package com.test.Swing; public class FaceTest1 { public static void main(String[] args) { int b = 543222; int a = 122345 ; int count =0; for(; a<b;a++) { String str = a + ""; if(str.indexOf("1")>= 0&& str.indexOf("2")>=0&&str.indexOf("3")>=0&&str.indexOf("4")>=0&&str.indexOf("5")>=0&&str.lastIndexOf("2")!=str.indexOf("2")&&Math.abs(str.indexOf("3")-str.indexOf("5"))!=1&&str.indexOf("4")!=2) { System.out.println(str); count++; } } System.out.println(count); } } 呵呵 比较简单 !~~ 总数是198个 我也测试过啦 应该是正确的。应用了String里的IndexOf的方法,一个for循环解决问题。但性能上不保证!~ 呵呵共同交流 上面str.indexOf("1")>= 0&& str.indexOf("2")>=0&&str.indexOf("3")>=0&&str.indexOf("4")>=0&&str.indexOf("5")>=0 表示必须有 12345 这些数字 str.lastIndexOf("2")!=str.indexOf("2")表示必须有2个2 Math.abs(str.indexOf("3")-str.indexOf("5"))!=1 表示不会出现35 和 53 str.indexOf("4")!=2 是不在第三位有4 呵呵 我下班了!~~ 呵呵 大概正确 下班前娱乐一下大家一起讨论呀 !~~~~~ |
|
返回顶楼 | |
发表时间:2011-03-10
rzk513 写道 楼主可能想复杂了 !~~
其实在十分钟内要我分析 第一。数组的范围122345 ---- 543221 之间 第二、 将数据转换成String的类型,因为int型的数组少很多方法,用String进行处理比较方便 我的代码如下: package com.test.Swing; public class FaceTest1 { public static void main(String[] args) { int b = 543221; int a = 122345 ; int count =0; for(; a<b;a++) { String str = a + ""; if(str.indexOf("1")>= 0&& str.indexOf("2")>=0&&str.indexOf("3")>=0&&str.indexOf("4")>=0&&str.indexOf("5")>=0&&str.lastIndexOf("2")!=str.indexOf("2")&&Math.abs(str.indexOf("3")-str.indexOf("5"))!=1&&str.indexOf("4")!=2) { System.out.println(str); count++; } } System.out.println(count); } } 呵呵 比较简单 !~~ 总数是197个 我也测试过啦 应该是正确的。应用了String里的IndexOf的方法,一个for循环解决问题。但性能上不保证!~ 呵呵共同交流 上面str.indexOf("1")>= 0&& str.indexOf("2")>=0&&str.indexOf("3")>=0&&str.indexOf("4")>=0&&str.indexOf("5")>=0 表示必须有 12345 这些数字 str.lastIndexOf("2")!=str.indexOf("2")表示必须有2个2 Math.abs(str.indexOf("3")-str.indexOf("5"))!=1 表示不会出现35 和 53 str.indexOf("4")!=2 是不在第三位有4 呵呵 我下班了!~~ 呵呵 大概正确 下班前娱乐一下大家一起讨论呀 !~~~~~ 我怎么算出来是198个..for(; a<b;a++) 这个应该是for(; a<=b;a++) 吧? |
|
返回顶楼 | |
发表时间:2011-03-10
呵呵。我的想法:
6个位置放入1,2,2,3,4,5 1.先放入3,5确保他们不是相连。 2.再放入4,滤掉三的位置 3.再放入1 剩下2个位置,剩下2个2。大家都懂的:1,3,4,5已经确定整个排列。 4.剩下位置放入2 print!OK! |
|
返回顶楼 | |
发表时间:2011-03-11
是否可以只考虑先排列12345全系列,对剩余的2进行插入并筛选呢。
|
|
返回顶楼 | |
发表时间:2011-03-12
最后修改:2011-03-12
AllenZhang 写道 现在小朋友思想这么复杂干啥。10分钟的题目么。
遍历122345到543221之间的整数,剔除不符合的就行了。 十分钟啊。。顶,,不过效率可不乐观 |
|
返回顶楼 | |
发表时间:2011-03-14
String [] arr = {"1","2","3","4","5"};
List<String> list = new ArrayList<String>(); for(int i1 = 0; i1 < arr.length;i1++) { for(int i2 = 0; i2 < arr.length;i2++) { if(i1 == 2 && i2 == 4) { continue; } for(int i3 = 0; i3 < arr.length;i3++) { if(i2 == 2 && i3 == 4) { continue; } for(int i4 = 0; i4 < arr.length;i4++) { if(i3 == 2 && i4 == 4) { continue; } for(int i5 = 0; i5 < arr.length;i5++) { if(i4 == 2 && i5 == 4) { continue; } String temp = ""; temp = arr[i1]+arr[i2]+arr[i3]+arr[i4]+arr[i5]; list.add(temp); } } } } } for(int i = 0; i < list.size();i++) { System.out.println(list.get(i)); } System.out.println(list.size()); 是这个意思吗? |
|
返回顶楼 | |
发表时间:2011-03-15
gbfd2012 写道 AllenZhang 写道 现在小朋友思想这么复杂干啥。10分钟的题目么。
遍历122345到543221之间的整数,剔除不符合的就行了。 十分钟啊。。顶,,不过效率可不乐观 哈哈 我也这么认为 现在的计算机效率又不会太低 凑合着 |
|
返回顶楼 | |
发表时间:2011-03-17
有那么复杂吗?如果都是数字不是狠好理解吗?最小的是122345 最大也就是543221,从122345++ 一直到543221,在过程中类型转换后,就进行一系列条件判断不就行了?这样写是最快的方法,没有太多的逻辑,太多的嵌套。而且很清晰的了解。你们写的那些算发,我没读过大学,有点看不懂。运用一般人的思维,不要转牛角尖。需求摆在那里,不要做什么需求都考虑到算法。算法那是靠天赋的。需求要通俗易懂,或许有跟简单的方法。代码不求多,不求复杂。只求经典,代码的简洁易懂是开发人员的共同梦想。
|
|
返回顶楼 | |