2018年4月12日 下午3:54
- 我错误的解法是:想通过if-else将所有的情况罗列出来。那么此时的问题时:有哪些特殊情况需要考虑?每种情况下如何进行pop和push操作。这样会在和判断中重复pop和push操作,这就是我的代码长的原因。
- 新的思考方式是:既然情况太多,还很有可能落下,那么干脆就不罗列了。想这么一个问题,拿到一个数我们只会pop和push操作,那么何时pop?何时push?pop,push分别集中在一起,而不是像上面的解法一样是分散的。
下面这个程序从头到尾都没有考虑:
- 1572 2
- 是:
- 1,5,7———pop
- 1,5,————pop
- 1,
- 1,2
- 不是:
- 1,5,7———pop
- 1,5,
- 1,5,2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56class Solution {
public:
std::string removeKdigits(std::string num, int k) {
//栈
std::vector<int> S;
int i_k = 0;
std::string result="";
//扫描进行对比,入栈
for(int i = 0; i < num.length(); i++){
// if(S.size() >= (num.size()-k)) break;//12345
if(i_k < k ){//5,4,3,2,1
if( S.empty()){
S.push_back(num[i]-'0');
}
else if(S[S.size()-1] <= num[i]-'0' ){//=号 1223
S.push_back(num[i]-'0');
}
else if(S[S.size()-1] > num[i]-'0'){
S.pop_back();
if(!S.empty()||(num[i]-'0')!=0){//100200
S.push_back(num[i]-'0');
}
i_k++;
}
}
else{
if(!S.empty()||(num[i]-'0')!=0){//100200
S.push_back(num[i]-'0');
}
}
}
while(S.size() > (num.size()-k)){
int back = S.back();
S.pop_back();
if(S.back() > back){
S.pop_back();
S.push_back(back);
}
}
//返回字符串
for(int i = 0; i < S.size(); i++){
result.append(1,'0'+S[i]);//这里不可以是""
}
//判空
if(result == ""){
result = "0";
}
return result;
}
};
- 是:
ac的
1 | class Solution { |