下面贴出两次初赛题,望大家给出好的解法!
1.
Problem Statement
已知除数集合divisors,K阶可分数是指一个正整数恰好可以被集合divisors中K个数字整除。
返回闭区间[A, B]中最大的K阶可分数。如果该区间不存在这样的数,返回-1。
public int findLargest(int[] divisors, int K, int A, int B)
2.
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开始)public int getValue(int n)
1.
Problem Statement
已知除数集合divisors,K阶可分数是指一个正整数恰好可以被集合divisors中K个数字整除。
返回闭区间[A, B]中最大的K阶可分数。如果该区间不存在这样的数,返回-1。
public int findLargest(int[] divisors, int K, int A, int B)
2.
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开始)public int getValue(int n)
if (divisors == null || divisors.length == 0 || A > B)
return -1;
int len = divisors.length, n = 0;
int maxK = -1;
while (A < B) {
for (int i = 0; i < len; i++) {
if (A % divisors[i] == 0)
n++;
else
continue;
if (n > K) {
A++;
break;
}
}
if (n == K) {
if (A > maxK)
maxK = A;
}
n=0;
A++;
}
return maxK; }
2.public int getValue(int n) {
StringBuffer A = new StringBuffer("0");
while (A.length() <= n) {
StringBuffer B = new StringBuffer("0");
for (int i = 0; i < A.length() - 1; i++)
if (Math.sqrt(i) % 1 == 0)
B.append(1 - (A.charAt(i)-'0'));
else
B.append(A.charAt(i)-'0');
A.append(B);
}
return A.charAt(n)-'0';
}第2题不大明白!