今天做了有道topcoder的题目,也是第一次在topcoder做题,弄了半天才知道怎么回事,比赛已经结束,可以说一下题目了,开始准备在linux下用c++写,结果开始做题发现题目在linux下有乱码,就又换到windows下做,由于windows下没有很好的编译器,就打开eclipse用java开编,题目很简单,我基本过了样例就提了。
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(); } }
这个题可以打表来提高效率,我只是简单的模拟做了一下。