今天做了有道topcoder的题目,也是第一次在topcoder做题,弄了半天才知道怎么回事,比赛已经结束,可以说一下题目了,开始准备在linux下用c++写,结果开始做题发现题目在linux下有乱码,就又换到windows下做,由于windows下没有很好的编译器,就打开eclipse用java开编,题目很简单,我基本过了样例就提了。
250分的题
[quote]
给定一个正整数n. 你可以修改n的十进制表示中任意一位而得到另一个十进制表示的数,你修改后得到的新数需要严格小于n (这个新数可以有一些前导0).请返回按照上述要求修改后得到的数中最大的一个。
[/quote]
500分的题:
[quote]
一个二进制序列由下面的伪代码生成:
String A = "0"
While (A的长度小于等于n)
创建一个和A一样长度的字符串B
For i=0,1,...length(A)-1
If (i 是完全平方数)
B[i] = 1-A[i]
Else
B[i] = A[i]
令A = A + B (即将B拼接在A后面)
End While
Return A
请注意,在上面的伪代码中,A[i]和B[i]分别表示字符串A和B中下标为i的字符(下标编号从0开始)。对“完全平方数”的定义是,对于整数i,存在整数j,使得i= j *j,则称i为完全平方数。
下面具体说明序列生成的过程:如果n=7,则在每一轮迭代中,A的取值依次为:0, 01, 0110, 01101010,所以最终产生的二进制序列就是0,1,1,0,1,0,1,0
请返回上述序列中下标为n的数字(该序列的下标从0开始)
[/quote]
这个题可以打表来提高效率,我只是简单的模拟做了一下。
250分的题
[quote]
给定一个正整数n. 你可以修改n的十进制表示中任意一位而得到另一个十进制表示的数,你修改后得到的新数需要严格小于n (这个新数可以有一些前导0).请返回按照上述要求修改后得到的数中最大的一个。
[/quote]
public class ChangeDigit {
public int change(int n) {
int a = n;
int p = 1;
while (a % 10 == 0) {
a /= 10;
p *= 10;
}
return n - p;
}
}
500分的题:
[quote]
一个二进制序列由下面的伪代码生成:
String A = "0"
While (A的长度小于等于n)
创建一个和A一样长度的字符串B
For i=0,1,...length(A)-1
If (i 是完全平方数)
B[i] = 1-A[i]
Else
B[i] = A[i]
令A = A + B (即将B拼接在A后面)
End While
Return A
请注意,在上面的伪代码中,A[i]和B[i]分别表示字符串A和B中下标为i的字符(下标编号从0开始)。对“完全平方数”的定义是,对于整数i,存在整数j,使得i= j *j,则称i为完全平方数。
下面具体说明序列生成的过程:如果n=7,则在每一轮迭代中,A的取值依次为:0, 01, 0110, 01101010,所以最终产生的二进制序列就是0,1,1,0,1,0,1,0
请返回上述序列中下标为n的数字(该序列的下标从0开始)
[/quote]
public class BinarySequence {
public int getValue(int n) {
String sequence = getSequence(n);
return sequence.charAt(n) - '0';
}
private String getSequence(int n) {
StringBuffer a = new StringBuffer();
a.append('0');
while (a.length() <= n) {
StringBuffer b = new StringBuffer(a);
for (int i = 0; i < a.length(); i++) {
if (i - (int) Math.sqrt(i) * (int) Math.sqrt(i) < 10e-10) {
b.setCharAt(i, (char) (1 + '0' - a.charAt(i) + '0'));
}
}
a.append(b);
}
return a.toString();
}
}
这个题可以打表来提高效率,我只是简单的模拟做了一下。