刪除K個數字,使剩下的數字串最大

來源:互聯網
上載者:User

題目:

一個n位的數,去掉其中的k位,問怎樣去掉使得留下來的那個(n-k)位的數最大?

分析:

可以直接用貪心來求解,每次尋找從頭開始的連續遞減序列,刪除遞減序列的最後一個元素,重複K次,最後剩下的數字串組成的數字最大。

比如:

“13787323”
第一次,遞減序列只有1,刪除1,得到3787323
第二次,遞減序列只有3,刪除3,得到787323
第三次,遞減序列只有7,刪除7,得到87323
第四次,遞減序列是8732,刪除2,得到8733

代碼如下:

#include <iostream>using namespace std;#define MAX 0x7fffffffint main(){int start;//指標指向儲存後數字串的最後一位int end;//指向以前的數字串數字int a[] = {MAX, 1,3,7,8,7,3,2,3};//在這裡面加入一個哨兵,放在最前面,不用考慮start會越界問題int k = 4; //刪除字元的個數int len = sizeof(a) / sizeof(a[0]);start =  0;end = 1;int count = 0;while(end <= len && count != k){if(a[end] <= a[start])a[++start] = a[end++];else{start--;count++;//每次刪除,記錄一次}}while(end <= len)//刪除已經完成,儲存後面的字元{a[++start] = a[end++];}for(int i = 1; i < len - k; i++)cout << a[i] << " ";cout << endl;return 0;}


測試案例可以是:1,2,3,4,5,6,7,8;8,7,6,5,4,3,2,1;

總結:

典型的貪心應用,而且使用兩個指標的方式,從頭往後找,時間複雜度是O(n),空間複雜度是O(1)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.