Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Codibility测试-查找范围内的倍数_C#_Algorithm_Time Complexity - Fatal编程技术网

C# Codibility测试-查找范围内的倍数

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..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时它将是不正确的(编辑:即使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。
  • 如果A不能被K除,那么符号是1,这意味着我们不应该把这个数增加1(所以我们用1-1计算)

  • 找到
    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);