Skip to content

Commit dd3968e

Browse files
给定一个整数,从整数中去掉k个数字,要求剩下的新整数尽可能小。给定的整数大小可以超过long类型的范围,所以需要用字符串来表示。
1 parent 1125c92 commit dd3968e

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package leetcode.str;
2+
3+
/**
4+
* <p>
5+
* 给定一个整数,从整数中去掉k个数字,要求剩下的新整数尽可能小。给定的整数大小可以超过long类型的范围,所以需要用字符串来表示。
6+
* </p>
7+
*
8+
* @author jwzhao
9+
* @version 1.0
10+
* @date 2018/11/29 14:35
11+
*/
12+
public class RemoveKDigits {
13+
14+
public static void main(String[] args) {
15+
RemoveKDigits removeKDigits = new RemoveKDigits();
16+
String num = "1432219";
17+
int k = 3;
18+
System.out.println(removeKDigits.removeKDigits(num, k));
19+
}
20+
21+
public String removeKDigits(String num, int k) {
22+
if (num == null || num.length() == 0 || num.length() == k) {
23+
return "0";
24+
}
25+
if (k == 0) {
26+
return num;
27+
}
28+
29+
int newLength = num.length() - k;
30+
31+
char[] nums = num.toCharArray();
32+
Stack stack = new Stack(nums.length);
33+
for(int i=0;i<nums.length;i++){
34+
String value = String.valueOf(nums[i]);
35+
String stackPop = stack.peek();
36+
while (k>0 && stackPop != null && (Integer.parseInt(value) < Integer.parseInt(stackPop))) {
37+
// 栈顶弹出,入当前值
38+
stack.pop();
39+
stackPop = stack.peek();
40+
k--;
41+
}
42+
stack.push(value);
43+
}
44+
45+
StringBuffer buffer = new StringBuffer();
46+
StringBuffer zero = new StringBuffer();
47+
while (!stack.isEmpty()) {
48+
String value = stack.pop();
49+
if ("0".equals(value)){
50+
zero.append(value);
51+
}else{
52+
if (zero.length() > 0){
53+
buffer.append(zero);
54+
}
55+
buffer.append(value);
56+
zero = new StringBuffer();
57+
}
58+
}
59+
if (buffer.length() == 0) {
60+
return "0";
61+
}
62+
if (newLength > buffer.length()){
63+
newLength = buffer.length();
64+
}
65+
return buffer.reverse().substring(0,newLength);
66+
}
67+
68+
public class Stack {
69+
70+
/**
71+
* 栈底层实现的数组
72+
*/
73+
private String[] stacks;
74+
/**
75+
* 栈顶指针
76+
*/
77+
private int top;
78+
79+
public Stack() {
80+
stacks = new String[8];
81+
top = -1;
82+
}
83+
84+
public Stack(int maxSize) {
85+
stacks = new String[maxSize];
86+
top = -1;
87+
}
88+
89+
/**
90+
* 入栈
91+
*
92+
* @param val
93+
*/
94+
public void push(String val) {
95+
stacks[++top] = val;
96+
}
97+
98+
/**
99+
* 查看栈顶元素
100+
*
101+
* @return
102+
*/
103+
public String peek() {
104+
if (this.isEmpty()) {
105+
return null;
106+
}
107+
return stacks[top];
108+
}
109+
110+
/**
111+
* 弹出栈顶元素
112+
*
113+
* @return
114+
*/
115+
public String pop() {
116+
if (this.isEmpty()) {
117+
return null;
118+
}
119+
return stacks[top--];
120+
}
121+
122+
/**
123+
* 判断是否为空
124+
*
125+
* @return
126+
*/
127+
public boolean isEmpty() {
128+
return top == -1;
129+
}
130+
131+
}
132+
}

0 commit comments

Comments
 (0)