献上两个java小算法
直接上代码:
1 /** 2 * Name: 求数组中元素重复次数对多的数和重复次数 3 * Description: 4 * 数组中的元素可能会重复,这个方法可以找出重复次数最多的数,同时可以返回重复了多少次。 5 * 但需要知道这个数组中最大的元素是多少,如果无法确定,就悲剧啦~ 6 * 7 * @param array目标数组; 8 * max数组中数据的最大值; 9 * @return 返回一个包含重复次数最多的数(value)和重复次数(maxCount)的map集合; 10 * 内部出现异常,默认返回0; 11 * @throws 12 * @Author 杨元 13 * Create Date: 2013-11-1 上午11:25:08 14 */ 15 public static Map<String, Integer> arraySearch(int[] array,int max){ 16 //结果集合 17 Map<String, Integer> resultMap = new HashMap<String, Integer>(); 18 //重复的次数 19 int maxCount = 0; 20 //重复次数对多的数 21 int value = 0; 22 23 try{ 24 //初始化数据数组,用来存放每个元素出现的次数 25 int[] dataArray = new int[max+1]; 26 27 //遍历要查找的数组,以每个元素为下标,直接定位数据数组,进行+1操作,表示出现了一次 28 for(int i : array){ 29 dataArray[i]++; 30 } 31 32 //找到数据数组中最大值 33 for(int i=0;i<dataArray.length;i++){ 34 if(dataArray[i]>maxCount){ 35 maxCount=dataArray[i]; 36 value=i; 37 } 38 } 39 }catch (Exception e) {} 40 41 resultMap.put("maxCount", maxCount); 42 resultMap.put("value", value); 43 44 return resultMap; 45 } 46 47 /** 48 * Name: 比较两个字符串大小 49 * Description: 比较的规则和数据库中的order by效果一致; 50 * null自动转为空,空字符串最大; 51 * 52 * @param first 要比较的第一个字符串; 53 * second 要比较的第二个字符串; 54 * @return first大于second返回正数; 55 * first等于second返回0; 56 * first小于second返回负数; 57 * 内部异常默认返回0; 58 * 返回值非固定值哦~~; 59 * @throws 60 * @Author 杨元 61 * Create Date: 2013-11-2 上午10:10:04 62 */ 63 public static int compareString(String first,String second){ 64 int result = 0; 65 66 try{ 67 //null转空 68 first = first==null?"":first; 69 second = second==null?"":second; 70 71 //预先记录字符串长度,避免反复读取 72 int firstLength=first.length(); 73 int secondLength=second.length(); 74 75 //处理含有空串的特殊情况 76 if("".equals(first) || "".equals(second)){ 77 //谁长谁小 78 result = secondLength-firstLength; 79 }else{ 80 //临时空间,用来存放ascii码总和 81 int firstCount = 0; 82 int secondCount = 0; 83 //用纯运算得出两个数中较小的数,实在是bt 84 int minLength = (secondLength*(firstLength/secondLength) + firstLength*(secondLength/firstLength))/(firstLength/secondLength + secondLength/firstLength); 85 //按两个字符串中较短的位数去逐位截取,防止越界 86 for(int i=0;i<minLength;i++){ 87 //求ascii码和 88 firstCount+=first.substring(i,i+1).getBytes()[0]; 89 secondCount+=second.substring(i,i+1).getBytes()[0]; 90 //和不相等,说明已经比较出了大小 91 if(firstCount!=secondCount){ 92 break; 93 } 94 } 95 96 if(firstCount==secondCount){ 97 //长度长的大 98 result = firstLength-secondLength; 99 }else{ 100 //总和大的大 101 result = firstCount-secondCount; 102 } 103 } 104 }catch (Exception e) {} 105 106 return result; 107 }
这是小菜利用闲暇时间所写。。
小菜觉得这两个算法仅仅是实现了而已,效率应该不是很高,但还可以凑合用。。。也可以给像俺这样的菜鸟提供一个思路。。。
代码中有详细的注释,小菜就不多说啦~