4 数组

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 }
算法描述

 

posted @ 2019-10-16 22:20  代号H  阅读(134)  评论(0编辑  收藏  举报