(關於一個演算法題的兩點新思路)給你一組字串 如 {5,2,3,2,4,5,1,2,1,5},讓你輸出裡面出現次數最多且數值最大的一個,出現幾次,字串匹配演算法
在網上看到一個演算法題,不是很難,搜一下也有解決辦法,但是一般都是幾層for迴圈,試著寫了下
/** * 給你一組字串 如 {5,2,3,2,4,5,1,2,1,5},讓你輸出裡面出現次數最多且數值最大的一個,出現幾次 * 優點:時間複雜度為O(n) * 缺點:產生一些多餘的空間,如 6,7,8沒有的數也會分配一個數組空間,但是基本可以忽略 * 限制:需要預Crowdsourced Security Testing道最大的值是多少,或者說小於多少,這樣才好確定預先分配一個數組長度是多少 */ public static void method1(){ int[] datas = {5,2,3,2,4,5,1,2,1,5}; int[] nums = new int[10];//0-9,此處若數組中的最大值為 123,則數組長度應為 >= 124 for (int i = 0; i < datas.length; i++) {int n = datas[i] - 0;nums[n]++; } int maxTime = 0; for (int i = 0; i < nums.length; i++) { System.out.println(i+":"+nums[i]);if(nums[i] > maxTime){maxTime = nums[i];} } System.out.println("最多的出現"+maxTime+"次"); int num = 0; for (int i = 0; i < nums.length; i++) { if(maxTime == nums[i]){ num = i; } } System.out.println("出現次數最多:"+maxTime+"次;且最大的數是:"+num); } /** * 給你一組字串 如 {5,2,3,2,4,5,1,2,1,5},讓你輸出裡面出現次數最多且數值最大的一個,出現幾次 * 優點:時間複雜度為O(n) * 缺點:暫時沒發現 */ public static void method2(){ int[] datas = {5,2,3,2,4,5,1,2,1,5}; Map<Integer,Integer> map = new HashMap<Integer, Integer>(); for (int i = 0; i < datas.length; i++) { Integer key = datas[i];Integer value = map.get(key);if(value != null){map.put(key, ++value);}else{map.put(key, 1);}} int maxTime = 0; int maxTime_num = 0; Set<Integer> keySet = map.keySet(); Iterator<Integer> it = keySet.iterator(); while(it.hasNext()){ Integer key = it.next(); Integer value = map.get(key); System.out.println(key+":"+value); if(value >= maxTime){ maxTime = value; if(key > maxTime_num){ maxTime_num = key; } } } System.out.println("出現次數最多:"+maxTime+"次;且最大的數是:"+maxTime_num); }
列印:
0:0
1:2
2:3
3:1
4:1
5:3
6:0
7:0
8:0
9:0
最多的出現3次
出現次數最多:3次;且最大的數是:5
-----------
1:2
2:3
3:1
4:1
5:3
出現次數最多:3次;且最大的數是:5
兩者的區別應該一下就看出來了
今天參加了華為的面試,被一個演算法題水了?如下:
根據要求修改了,複雜度為O(n),沒有引入額外的數組:)
#include <stdio.h>
#define N 7
void main(){
int a[N],step,temp;
printf("輸入%d個整數:\n",N);
for(int l=0;l<N;l++)
scanf("%d",&a[l]);
printf("輸入步長:\n");
scanf("%d",&step);
step=step%N;
int k=0,n=0;
for(int i=step;i<N+step;i++,k++){
if(step)
k=k%step;
n=i%N;
temp=a[n];
a[n]=a[k];
a[k]=temp;
}
printf("輸出移位後的數組:\n");
for(int m=0;m<N;m++)
printf("a[%d]=%d\n",m,a[m]);
}
一道演算法題
因為動態規劃會有後效性,而貪心也不行。所以推薦暴力搜尋,從枚舉使用5的個數開始,依次4,3,2,1。
可以做一些適當的剪枝,比如1.當前的總數不應超過目標m,2.在當前情況下可以通過x個每一個數就能完成m時,也停止搜尋。