LintCode 182. 删除数字
182. 删除数字
给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。
找到删除 k 个数字之后的最小正整数。
N <= 240, k <= N
样例
给出一个字符串代表的正整数 A 和一个整数 k, 其中 A = 178542, k = 4
返回一个字符串 "12"
思路:删去数字使得最后剩余的数字最小,相当于从当前数字里面找到相应个数数字使之最小,可以使用贪心思想
从前往后找第一个最小值使之成为找到的数的第一个数字,需要注意的是为了保证后面仍然存在足够多的数用来选择,查找
的区间是有限的是从[start,A.size()-count]这样一个区间里,每当找到这样一个数,剩余数的查找范围相应也就缩短了
然后依次递归找到一系列数
写法1:没通过,这道题对于第一个数是可以为0的,我的写法是第一个数排除0的写法
class Solution { public: /** * @param A: A positive integer which has N digits, A is a string * @param k: Remove k digits * @return: A string */ string DeleteDigits(string &A, int k) { // write your code here int size = A.size(); if(size <= k) return 0; int index = k; for(int i = k; i>=0; --i){ if(A[i]<=A[index] && A[i]!='0') index = i; } string res = ""; res.push_back(A[index]); string r = MinNum(A,index+1,size-k-1); if(r == "-1") return res; return res+r; } string MinNum(string &A, int start, int count){ if(count == 0) return "-1"; int index = A.size()-count; for(int i = A.size()-count; i>=start; --i){ if(A[i]<=A[index]) index = i; } string res = ""; res.push_back(A[index]); string r = MinNum(A,index+1,count-1); if(r == "-1") return res; return res+r; } };
写法2:通过,思路和上面相同,唯一需要的就是对最后得到的string做一下头部去0
class Solution { public: /** * @param A: A positive integer which has N digits, A is a string * @param k: Remove k digits * @return: A string */ string DeleteDigits(string &A, int k) { // write your code here int size = A.size(); if(size <= k) return "0"; string r = MinNum(A,0,size-k); int index = 0; for(;index<r.size();++index){//头部去0操作 if(r[index]!='0') break; } return r.substr(index);//substr用法:substr(m,n)从m位置开始取n个字符;substr(m)从第m个字符截取到末尾 } string MinNum(string &A, int start, int count){//start表示每次取到数字之后下一个数字取值范围的起点,count表示仍然需要取得数字个数 if(count == 0) return "-1";//迭代出口 int index = A.size()-count; for(int i = A.size()-count; i>=start; --i){//在这个范围里面取第一个最小值 if(A[i]<=A[index]) index = i; } string res = ""; res.push_back(A[index]); string r = MinNum(A,index+1,count-1);//递归 if(r == "-1") return res; //迭代出口特殊处理 return res+r; } };
好像只要写个循环就可以了,没必要用递归。。。算了,思想懂了应该就问题不大。
Know More ,Do More.