先说明一下,我遇到的第二题跟大家先前讨论的第二题题目不同,不过最近算法挺火,也就放上来,大家一起讨论讨论,而且我觉得有道这次比赛非常好,我看了下TopCode平台,大家平时也可以进这个平台练习一下算法,不过。。。。有道的翻译还真有待提高了
声明一下,我算法没有学过,只是想到了解决的方法,当时理解题目花了我很多时间,不知道是我太笨还是题目真有问题,呵呵。废话不说,上题目:
Problem Statement
一个二进制序列由下面的伪代码生成: 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开始) Definition
Class: BinarySequence Method: getValue Parameters: int Returns: int Method signature: int getValue(int n) (be sure your method is public)
Constraints - n 的取值大于等于0,小于等于2,000,000,000 Examples 0)
7 Returns: 0 原因参见题目描述。 1) 2 Returns: 1 2) 8 Returns: 1 这一次,生成的序列为0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0. 3) 11 Returns: 0 4) 10 Returns: 1 5) 15 Returns: 0 |
头大,乱七八糟一堆东西,看了老半天,最后跟大家一样,来了句,原来如此啊,ok,理解了题目,上代码:
2 {
3 public int getValue(int n)
4 {
5 int result = 0;
6
7 string A = "0";
8
9 while (A.Length <= n)
10 {
11 string[] B = new String[A.Length];
12 for (int j = 0; j < A.Length; j++)
13 {
14 if (IsSquare(j))
15 {
16 B[j] = (1 - Convert.ToInt32(A[j].ToString())).ToString();
17 result++;
18 }
19 else
20 {
21 B[j] = A[j].ToString();
22 }
23 }
24 A = A + String.Join("", B);
25 //Console.WriteLine(A);
26 }
27
28 return int.Parse(A[n].ToString());
29 }
30
31 public bool IsSquare(int n)
32 {
33 bool result = false;
34
35 for (int i = 0; i <= n; i++)
36 {
37 if (i * i == n)
38 {
39 return true;
40 }
41 }
42
43 return result;
44 }
45 }
单纯为了解决方法做的,效率谈不上,性能也不好,不过刚想到一个有趣的解法,准备下午的时候抽空写写,哈哈
写算法纯粹是为了玩,不是要证明自己如何,大家也不必说算法到底有用无用,有用无用都是根据自己的工作来看的,不过业余时间玩玩算法,真的很好。
PS:写的不好,希望大家不要乱拍钻