1. 程式人生 > >移掉K位數字

移掉K位數字

貪心思想

最高位要儘可能的小,次高位也是要保留小的數字。所以遍歷這個string時遇到比前一位小的數字的話,就要把前一位刪掉,把當前這一位儲存進去。

用一個vector模擬棧,注意一些情況,1.當前的數如果是0怎麼辦,因為0不能做最高位,所以要判斷結果res中是否為空,不為空的話,0才可以加入。2.如果string 都遍歷完了,k還大於0怎麼辦,出現這種情況的原因是string的每一位是遞增關係。3.結果為空返回“0”

class Solution {
public:
    string removeKdigits(string num, int k) {
        vector<int>res;//模擬棧
        string str = "";//結果string
        //遍歷Num的每位
        for(int i =0;i<num.size();++i)
        {
            int number = num[i] - '0';//先轉成int
            //如果res中有數的話,並且現在正在遍歷的這個數小於“棧頂”元素,並且k的值還沒有用完的話
            //就把棧頂元素(也就是末尾元素)彈出來,然後可用次數減1
            while(res.size()!=0 && number < res[res.size()-1] && k>0)
            {
                res.pop_back();
                k--;
            }
            //如果當前這個數不是0的話,就可以直接放入,或者,如果是0的話,那就看“棧”中還有沒數,有的話,也可以直接加入
            if(number!=0 || res.size()!=0)
            {
                res.push_back(number);
            }
        }
        //遍歷結束後,有可能k沒有用完,比如Num= 12345,k=2,遍歷結束時k還是=2
        while(res.size()!=0 && k>0)
        {
            res.pop_back();
            k--;
        }
        //最後將res中的int連線成string
        for(int i =0;i<res.size();++i)
        {
            str.append(1,'0'+res[i]);
        }
        if(str == "")//特殊情況
            str = "0";
        return str;
        
    }
};

相關推薦

402.K數字

給定一個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。 注意: num 的長度小於 10002 且 ≥ k。 num 不會包含任何前導零。 示例 1 : 輸入: nu

402. K數字

給定一個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。 注意: num 的長度小於 10002 且 ≥ k。 num 不會包含任何前導零。 示例 1 : 輸入: nu

Leetcode 402.k數字

移調k位數字 給定一個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。 注意: num 的長度小於 10002 且 ≥ k。 num 不會包含任何前導零。 示例 1 : 輸入: num = "1432219", k = 3

K數字

貪心思想最高位要儘可能的小,次高位也是要保留小的數字。所以遍歷這個string時遇到比前一位小的數字的話,就要把前一位刪掉,把當前這一位儲存進去。用一個vector模擬棧,注意一些情況,1.當前的數如果是0怎麼辦,因為0不能做最高位,所以要判斷結果res中是否為空,不為空的話

演算法46----K數字

一、題目:移除K位數字 給定一個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。 注意: num 的長度小於 10002 且 ≥ k。 num 不會包含任何前導零。 示例 1 : 輸入: num = "1432219", k = 3 輸

算法46----K數字

一個 type 就是 digi n) ack strong 新的 輸入 一、題目:移除K位數字 給定一個以字符串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。 註意: num 的長度小於 10002 且 ≥ k。 num 不會包含任何前導零。

有趣的演算法題之k 數字後使剩下的數字最小

原文:微信公眾號:程式設計師小灰——刪去k個數字後的最小值 1 題目 給定一個整數,從該整數中去掉 k 個數字,使剩下的數字組成的新整數儘可能小,那麼應該選擇去掉的數字。 2 思路 感覺這是個挺有意思的問題,所以當時認真的讀了讀也認真的想了想,真是不想不知道,一想才發現

K 得到最小值—9

貪心演算法,思路:考慮最前面的數與後面的數比較,如果前面的數大於後面的數則刪除。 描述 有一行由 N 個數字組成的數字字串,字串所表示的數是一正整數。移除字串中的 K 個數字,使剩下的數字是所有可能中最小的。 假設: 字串的長度一定大於等於 K 字串不會以 0 開頭

leetcode 402 Remove K Digits(k數字 貪心)

分析和思路: 就是說給一個字串形式的正數,刪除k個數字,使得字串數字最小 貪心思路 那麼就是每次刪除一個數,每次保證高位最小。 java程式碼: class Solution { public String removeKdigits(String num

10、k得到最小值

(個人水平有限,請見諒!) 描述: 有一行由 N 個數字組成的數字字串,字串所表示的數是一正整數。移除字串中的 K 個數字,使剩下的數字是所有可能中最小的。 假設: 字串的長度一定大於等於 K。 字串不會以 0 開頭。 輸入: 一行由 N 個數

將數組k

code pub 思路 str print 右移 ++ println 互換 思路 : 反轉的算法 *3次即可先把 第 k-n-1 反轉把0 -k-1 反轉整體反轉 即可 //把數組循環右移K位 public class Test_plus { /* *數組

實現將一維陣列A(下標從1開始)中的元素迴圈右k,要求只用一個元素大小的輔助空間

#include<stdio.h>main(){ int n,arrary[50],k,temp; printf("請輸入陣列元素個數:\n"); scanf("%d",&n); for(int i=1;i<=n;i++) scanf

實現將一維數組A(下標從1開始)中的元素循環右k,要求只用一個元素大小的輔助空間

維數 輔助 數組a emp 數組元素 移動 scan clu n) #include<stdio.h>main(){ int n,arrary[50],k,temp; printf("請輸入數組元素個數:\n"); scanf("%d",&n); for

設計一個演算法,將一維陣列A(下標從1開始)中的元素迴圈右k,要求只用一個元素大小的附加儲存空間。給出演算法的時間複雜度。

程式碼 #include<stdio.h> #include<stdlib.h> #define n 10 int main() { int a[n] = { 0,1,2,3,4,5,6,7,8,9 }; int k, t=0,i,j,m; printf(

把一個含有N個元素的陣列迴圈右K, 要求時間複雜度為O(N)

分析與解法 這個解法其實在《啊哈!演算法》有講到。 假設原陣列序列為abcd1234,要求變換成的陣列序列為1234abcd,即迴圈右移了4位,比較之後,不難看出,其中有兩段的順序是不變的:1234和abcd,可把兩段看成兩個整體。右移K位的過程就是把陣列的兩部分交換一下。

day23之陣列迴圈右k+去除重複的字元。

將N個字元的陣列,迴圈右移K位。時間複雜度O(N)。 #include<iostream> using namespace std; #include<cassert> #include<string.h> vo

陣列迴圈右 k

例: arr[] = 12345678; k = 2 1.逆序前 6(8-2) 位 -> 65432178 2.逆序後 2 位 -> 65432187 3.全部逆序 -> 7

陣列:如何把一個數組迴圈右K

問題描述: 假設要把陣列12345678右移2位,變為78123456。 分析: 方法一: 比較移位前後陣列序列的形式,不難看出,其中有兩段序列的順序是不變的,即就是 78 和 123456, 可以把這兩段看做兩個整體,右移k位就是把陣列的兩部分交換一下。時間複雜度為

將陣列迴圈右k

將陣列移位就相當於將兩部分序列交換位置,於是將陣列移位轉換為三次反轉操作,如123456右移2位結果為561234,過程:分別將1234和56反轉為4321和65,之後對反轉結果432165做一次反轉結果為561234,java程式碼如下: //將數字