1 一维数组即为线性表,二维数组可以定义为“其数据元素为一维数组”的线性表。
1.1 查找多数元素:假设一个数组中多数元素存在,找出数组中占50%以上的元素。
算法思想:每找出两个不同的element,就成对删除,最终剩下的一定就是所求的。
1 public static int majorityElement(int[] nums) 2 { 3 int element = 0; 4 int count = 0; 5 for(int i = 0; i < nums.length; i++) 6 { 7 if(count == 0) 8 { 9 element = nums[i]; 10 count = 1; 11 } 12 else 13 { 14 if(element == nums[i]) 15 count++; 16 else 17 count--; 18 } 19 } 20 return element; 21 }
1.2 把数组排成最小数:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
算法思想 将数组转换为String数组,在新规则下对数组进行排序(本例使用了选择排序)。
1 public static String PrintMinNumber(int[] num) 2 { 3 if(num == null || num.length == 0) 4 return ""; 5 int n = num.length; 6 String[] s = new String[n]; 7 for(int i = 0; i < n; i++) 8 s[i] = String.valueOf(num[i]); 9 for(int i = 0; i < s.length; i++) 10 { 11 int k = i; 12 for(int j = i + 1; j < s.length; j++) 13 if(compare(s[k], s[j])) k = j; 14 if(k != i) 15 { 16 String x = s[i]; 17 s[i] = s[k]; 18 s[k] = x; 19 } 20 } 21 StringBuilder sb = new StringBuilder(); 22 for(int i = 0; i < s.length; i++) 23 sb = sb.append(s[i]); 24 return sb.toString(); 25 } 26 private static boolean compare(String s1, String s2) 27 { 28 int n = s1.length() + s2.length(); 29 String str1 = s1 + s2; 30 String str2 = s2 + s1; 31 for(int i = 0; i < n; i++) 32 { 33 if(Integer.parseInt(str1.substring(i, i + 1)) > Integer.parseInt(str2.substring(i, i + 1))) 34 return true; 35 if(Integer.parseInt(str1.substring(i, i + 1)) < Integer.parseInt(str2.substring(i, i + 1))) 36 return false; 37 } 38 return false; 39 }