土人的家
导航
BlogJava
首页
新随笔
联系
聚合
管理
统计信息
Posts - 15
Stories - 0
Comments - 0
Trackbacks - 0
常用链接
我的随笔
我的评论
我的参与
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
DP(4)
(rss)
Greedy(2)
(rss)
Math(2)
(rss)
Search(6)
(rss)
随笔档案
2009年12月 (5)
2009年11月 (10)
搜索
最新评论
阅读排行榜
1. MatchString(186)
2. TheSumOfLuckyNumbers(163)
3. ProperDivisors(141)
4. CollectingMarbles(140)
5. IdealString(139)
评论排行榜
1. TheSumOfLuckyNumbers(0)
2. IdealString(0)
3. AvoidingProduct(0)
4. CollectingMarbles(0)
5. MatchString(0)
RemovingDigits
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来做
不过没有看答案解决掉很难得...继续加油
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
}
posted on 2009-11-19 20:21
jav7er
阅读(127)
评论(0)
编辑
收藏
所属分类:
Greedy
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
MatchString
RemovingDigits