发表时间:2010-05-27
抛出异常的爱 写道 王者之剑 写道 唉,已经有人给出了比较好的答案(kimmking,qhfu),后面还会冒出来一堆错误的,讨论问题,最可悲的事情莫过于此:连正确的答案都不知道是正确的,还有什么好讨论的?
你是可悲什么? 没有更好的答案? 还是有了正确答案还要花时间研究? 9494. 像这种试题,你写循环都是不理想的答案。 逆向思维考虑吧!能用正常循环判断解决的,没必要拿出来考你了。 |
|
发表时间:2010-05-27
sovolee 写道 抛出异常的爱 写道 王者之剑 写道 唉,已经有人给出了比较好的答案(kimmking,qhfu),后面还会冒出来一堆错误的,讨论问题,最可悲的事情莫过于此:连正确的答案都不知道是正确的,还有什么好讨论的?
你是可悲什么? 没有更好的答案? 还是有了正确答案还要花时间研究? 9494. 像这种试题,你写循环都是不理想的答案。 逆向思维考虑吧!能用正常循环判断解决的,没必要拿出来考你了。 我用一次循环解决我觉得已经是最少的了... 这....不用循环如何解决,实在想不出来.求教 |
|
发表时间:2010-05-27
1、先把数组里的数字 都放到Set里面
目的:去重复 2、把set转换成list,然后排序 目的:去重复后的数字排序 3、取list中的第一个值a和最后一个值b,然后判断 b-a+1 = list.size() 目的:返回true,说明连续 返回false,说明不连续 |
|
发表时间:2010-05-27
.................说错了
|
|
发表时间:2010-05-27
sovolee 写道 抛出异常的爱 写道 王者之剑 写道 唉,已经有人给出了比较好的答案(kimmking,qhfu),后面还会冒出来一堆错误的,讨论问题,最可悲的事情莫过于此:连正确的答案都不知道是正确的,还有什么好讨论的?
你是可悲什么? 没有更好的答案? 还是有了正确答案还要花时间研究? 9494. 像这种试题,你写循环都是不理想的答案。 逆向思维考虑吧!能用正常循环判断解决的,没必要拿出来考你了。 为什么不能用正常循环判断? public static void main(String[] args) { int[] arr = {1,5,2,4,3}; Map<Integer,Integer> map = new TreeMap<Integer, Integer>(); for(int i : arr){ map.put(i, (i-1)); } boolean firstIsNull =true; for(int i : map.keySet()){ if(map.get(map.get(i))!=null){ continue; }else if(firstIsNull){ firstIsNull = false; }else{ System.out.println("broken link" + i); break; } } } public class StarEnds { LinkedList<StarEnd> qeuqeu = new LinkedList<StarEnd>(); public StarEnds add(StarEnd other) { Iterator<StarEnd> it = qeuqeu.iterator(); while(it.hasNext()){ StarEnd temp = it.next(); if(StarEnd.isMix(temp, other)){ other.inputOther(temp); it.remove(); } } qeuqeu.add(other); return this; } public Iterator<StarEnd> iterator(){ return qeuqeu.iterator(); } public static void main(String[] args) { StarEnds ses = new StarEnds(); int[] arr = {1,2,4,5}; for(int i : arr){ StarEnd temp = new StarEnd(); temp.star=i; temp.end =i+1; ses.add(temp); } System.out.println(ses.qeuqeu); } } class StarEnd{ int star=0; int end=0; @Override public String toString() { return "{"+star+":"+end+"}"; } public void inputOther(StarEnd other){ List<Integer> l = Arrays.asList(star,end,other.star,other.end); star = Collections.min(l); end = Collections.max(l); other.star = 0; other.end = 0; } public static boolean isMix(StarEnd one, StarEnd other) { if(one==null||other==null){ return false; } return one.inStarEnd(other.star)||one.inStarEnd(other.end) ; } public boolean inStarEnd(int in){ return (in >= star && in<= end); } } |
|
发表时间:2010-05-27
先排个序,然后用map存,好像会好一点,有重复的就不添加,最后再看map中少不少...
|
|
发表时间:2010-05-27
public static void main(String[] args) {
// TODO Auto-generated method stub int[] intArr = { 1, 1, 3, 4, 5, 6 }; Arrays.sort(intArr); List alist = new ArrayList(); for (int i = 0; i < intArr.length; i++) { alist.add(intArr[i]); } HashSet hs = new HashSet(); hs.addAll(alist); alist.clear(); Iterator it = hs.iterator(); while (it.hasNext()) { alist.add(it.next()); } int max = (Integer) alist.get(alist.size() - 1); int min = (Integer) alist.get(0); if ((max - min) == alist.size() - 1) { System.out.println("是连续的"); } else { System.out.println("不是连续的"); } } |
|
发表时间:2010-05-27
只要去掉重复的的数字后的数组长度!=最大值-最小值,返回false
|
|
发表时间:2010-05-27
public static boolean isContinousArray(int[] intArr){ char[] tempArr = new char[10]; Arrays.fill(tempArr, ' '); for (int i:intArr) { tempArr[i] = '1'; } String tempStr =new String(tempArr); if (tempStr.trim().contains(" ")) { return false; } else { return true; } } 如果里面数字只有0-9,那么这样是最快的。 |
|
发表时间:2010-05-28
一般来说,考一个简单的算法,前提都是 只能用基本数据类型和数组,然后再考虑最优的时间和空间复杂度。 如果题目复杂,可以用现有的各种基础数据类型,链表,堆,hash等,但是这些东西运行时其本身的时间和空间复杂度必须要计算在内。 本题用 set map sort 都是末流。 基于数组的三次循环,感觉已经是目前能想到的最优的了。 重复数据的问题,可以简单修正。 |