TopCoder SRM 396 Level2 1000
http://www.topcoder.com/stat?c=problem_statement&pm=8721&rd=12168
给定一个字符串里面包含了若干个1~9的数字,另一个字符串为其子集,对于后者中每个字符,从前面字符串中删去相应的一个数字
求删去剩下的数字的最大值
由于是求最大值,直接在计算过程中不断贪心在最高位谋取最大值
从前面按照9~1的顺序寻求可以做当前最高位的最大值
分以下4步:
1.对于所有都要删去的数字,直接删光
2.从前面开始查找,将所有无法删去的数字加入答案中
3.从前面按照9~1的顺序找可以用的最大值,如果其前面的所有数字都可以删去,那么就取这个数,否则递减
4.若字符串为空则结束,否则循环第一步
这一题足足做了2个多小时
想法很快就有了
但是在实现中String类型不能修改和删除的问题很难处理
最后干脆把String转化为LinkedList来做
不过没有看答案解决掉很难得...继续加油
http://www.topcoder.com/stat?c=problem_statement&pm=8721&rd=12168
给定一个字符串里面包含了若干个1~9的数字,另一个字符串为其子集,对于后者中每个字符,从前面字符串中删去相应的一个数字
求删去剩下的数字的最大值
由于是求最大值,直接在计算过程中不断贪心在最高位谋取最大值
从前面按照9~1的顺序寻求可以做当前最高位的最大值
分以下4步:
1.对于所有都要删去的数字,直接删光
2.从前面开始查找,将所有无法删去的数字加入答案中
3.从前面按照9~1的顺序找可以用的最大值,如果其前面的所有数字都可以删去,那么就取这个数,否则递减
4.若字符串为空则结束,否则循环第一步
这一题足足做了2个多小时
想法很快就有了
但是在实现中String类型不能修改和删除的问题很难处理
最后干脆把String转化为LinkedList来做
不过没有看答案解决掉很难得...继续加油
1
import
java.util.
*
;
2
import
java.util.regex.
*
;
3
import
java.text.
*
;
4
import
java.math.
*
;
5
import
java.awt.geom.
*
;
6![]()
7
public
class
RemovingDigits
8![]()
{
9
public String maxNumber(String number, String digits)
10![]()
{
11
int[] numCnt = new int[10];
12
int[] digCnt = new int[10];
13
Arrays.fill(numCnt, 0);
14
Arrays.fill(digCnt, 0);
15
int i;
16
for(i = 0 ; i < number.length(); ++ i)
17
numCnt[number.charAt(i)-'0']++;
18
for(i = 0 ; i < digits.length(); ++ i)
19
digCnt[digits.charAt(i) - '0']++;
20
StringBuilder ans = new StringBuilder("");
21
List<Character> target = new LinkedList<Character>();
22![]()
for(i = 0 ; i < number.length(); ++ i)
{
23
target.add(number.charAt(i));
24
}
25![]()
while(!target.isEmpty())
{
26
//remove digits that all should be removed
27![]()
for(i = 1 ; i < 10 ; ++ i)
{
28![]()
if(numCnt[i] == digCnt[i])
{
29
char c = (char) ('0'+i);
30
while(target.remove((Character)c));
31
// target.remove((Character)c);
32
numCnt[i] = 0;
33
digCnt[i] = 0;
34
}
35
}
36
//append all that cannot be removed
37![]()
for(i = 0 ; i < target.size(); ++ i)
{
38
if(digCnt[target.get(i)-'0'] != 0)
39
break;
40
ans.append(target.get(i));
41
}
42![]()
for(--i;i >= 0; -- i)
{
43
numCnt[target.get(i)-'0']--;
44
target.remove(i);
45
}
46
if(target.isEmpty())
47
break;
48
49
//find the largest head number
50
Outer:
51![]()
for(i = 9 ; i > 0 ; -- i)
{
52
//whether there is still this number
53
if(numCnt[i] == 0)
54
continue;
55
char c = (char) ('0'+i);
56
int idx = target.indexOf((Character)c);
57
int j;
58
int[] tempCnt = new int[10];
59
Arrays.fill(tempCnt, 0);
60
for(j = 0 ; j < idx ; ++ j)
61
tempCnt[target.get(j)-'0']++;
62![]()
for(j = 1 ; j < 10; ++ j)
{
63
if(tempCnt[j] > digCnt[j])
64
continue Outer;
65
}
66![]()
for(j = 1; j < 10; ++ j)
{
67
digCnt[j] -= tempCnt[j];
68
numCnt[j] -= tempCnt[j];
69
}
70
numCnt[i]--;
71
ans.append(target.get(idx));
72
for(j = idx; j >=0; --j)
73
target.remove(j);
74
break;
75
76
}
77
}
78
return ans.toString();
79
}
80
}
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
56
57
58
59
60
61
62

63
64
65
66

67
68
69
70
71
72
73
74
75
76
77
78
79
80