C# Codibility测试-查找范围内的倍数
我申请了一份工作,并被要求做一个密码测试。测试如下: 返回[A..B]范围内可被K整除的整数数 Args:C# Codibility测试-查找范围内的倍数,c#,algorithm,time-complexity,C#,Algorithm,Time Complexity,我申请了一份工作,并被要求做一个密码测试。测试如下: 返回[A..B]范围内可被K整除的整数数 Args: A:是[0..2000000000]范围内的整数 B:是[0..2000000000]范围内的整数,A似乎(B-A)/K加上边界检查就足够了 编辑: 不要只是复制(B-A)/K来使用,虽然这将是骨骼结构代码,但您需要添加正确的边界检查。把这当作一种思维方式 对于那些认为边界检查需要O(n)的人来说,你错了O(1)足以进行边界检查。您只需要检查A/B与K的关系 这是一个稍微简化的解决方案
- A:是[0..2000000000]范围内的整数
- B:是[0..2000000000]范围内的整数,A似乎
加上边界检查就足够了(B-A)/K
编辑: - 不要只是复制
来使用,虽然这将是骨骼结构代码,但您需要添加正确的边界检查。把这当作一种思维方式(B-A)/K
- 对于那些认为边界检查需要
的人来说,你错了O(1)足以进行边界检查。您只需要检查A/B与K的关系O(n)
这是一个稍微简化的解决方案,当A=0时它将是不正确的(编辑:即使A=0,它看起来也会起作用,但答案末尾的第二个版本更清楚) 首先,定义一个函数,该函数返回K除以N的数: 在Python中:
def result_upto(n, k):
return n // k
那么答案就是result_up(B,k)-result_up(A-1,k)
编辑。让我们为A=0的情况修正它
零可以被任何东西除,所以我们有这样的测试用例:
// solution(A, B, K)
solution(0, 0, 1) = 1 // 0
solution(0, 1, 1) = 2 // 0, 1
solution(0, 5, 2) = 3 // 0, 2, 4
更新的功能可以是:
def result_upto(n, k):
if n >= 0:
return n // k + 1 % account for zero
else:
return 0
那么答案仍然是result_Up to(B,k)-result_Up to(A-1,k)。可以是O(1)的一个线性的解决方案是:
intboundarycheck=(1-(int)Math.signum(A%K))+(1-(int)Math.signum(B%K));
if(K
我们应该考虑3例,K。
找到
m1=A%K
和m2=B%K
并使用算术级数,通过使用以下公式找到范围内的总nos
m1 = A%K;
m2 = B%K;
if(m1>0)
a = A + K - m1;
b = B - m2;
if(b>=a) {
total = (b-a)/K + 1;
}
else total = 0;
以上是
O(1)
解决方案,因为我们不需要知道这些数字是什么,我们可以通过以下方式简单地找到计数:
public long solution(long low, long high, long K)
{
return (((high - low)/K) + 1);
}
例如:
0..100乘5=21
复杂性:O(1)这是我的Java解决方案,得分100%
public int solution(int A, int B, int K) {
int count = (B/K - A/K) + (A%K == 0 ? 1 : 0);
return count;
}
一种更有效的方法是简单地从A到B生成C的倍数,这样就不必检查每个值。C越大,效率就越高
do
{
int a = start + (C * i++);
if (a >= A && a <= B)
{
//display a;
}
if (a > B)
break;
}while (true);
do
{
int a=开始+(C*i++);
如果(a>=a&&a B)
打破
}虽然(正确);
考虑A=1、B=2、K=2。你的解:((B-A)/K)+(1-数学符号(A%K))=((2-1)/2)+(1-数学符号(1%2))=0+(1-1)=0。正确的解决方案当然是1。这在大多数情况下都有效,但当使用解决方案(1,3,3)调用时,它返回0,答案应该是1。谢谢,使用此逻辑调用解决方案(6,10,2)返回2,这是错误的。应该是3。我不认为这种方法有效。例如,想象一些大K和一些A和B,因此B-A是大的,但B-A仍然(B-A)/K
。就像我说的,你需要找出正确的边界检查。把这当作一种思维方式。@SergeyDymchenko不,O(1)
足以进行边界检查。您只需检查A
/B
与K
之间的关系。此逻辑正确,但公式应为(B-(A-1))/K,因为A和B是包含的。这是有效的!我刚刚做了(B/K)-((A-1)/K)-整个范围内K的倍数减去较低范围内的倍数。谢谢。应该提一下这是@herohuyongtao/@Sergeys答案的组合。谢谢你们两位的帮助,完美的答案。同样的代码也适用于C#!
public static int solution2(int A, int B, int K)
{
return (int)Math.Floor(((B - A) % (double)K));
}
public static void CheckDivisibility(int A,int B, int k)
{
int firstdivisorpos = A + (k- (A%k));
int lastdivisorpos = B-B%k;
int totalnosdivisble = (lastdivisorpos - firstdivisorpos)/k;
Console.WriteLine(totalnosdivisble+1);
Console.ReadKey();
}
public int solution(int A, int B, int K) {
int count = (B/K - A/K) + (A%K == 0 ? 1 : 0);
return count;
}
do
{
int a = start + (C * i++);
if (a >= A && a <= B)
{
//display a;
}
if (a > B)
break;
}while (true);