(關於一個演算法題的兩點新思路)給你一組字串 如 {5,2,3,2,4,5,1,2,1,5},讓你輸出裡面出現次數最多且數值最大的一個,出現幾次,字串匹配演算法

來源:互聯網
上載者:User

(關於一個演算法題的兩點新思路)給你一組字串 如 {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時,也停止搜尋。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.