【问题标题】:Sum of last k digits same as sum of first k digits最后 k 位的总和与前 k 位的总和相同
【发布时间】:2013-06-06 10:59:03
【问题描述】:

我想找出给定范围内少数数字的前 k 位数字的总和是否等于后 k 位数字的总和。这里范围很大,k小于20。

我们可以做到这一点的一种方法是通过蛮力方法。有人可以建议一些其他有效的算法。一样的吗?

【问题讨论】:

  • 你能用一些例子澄清一下吗?
  • @HamZa 为什么?你不明白什么?
  • 谁需要那个?对于哪个应用程序,您需要比直截了当的解决方案更好的解决方案?
  • 仍然不清楚“给定范围内的少数数字”是什么意思。您是否需要比较适当 n、n+1、n+2、... m (n
  • 你打算只使用同一个数组一次还是多次?

标签: algorithm


【解决方案1】:

如果是范围,第一个数字不会经常变化,最后一个数字会以简单的方式变化。 S 是前 20 位数字的总和。虽然第二位不变,但当您转到下一位时,总和将加一。因此,如果除了最后一位之外,您的所有数字都是固定的,并且如果最后一位数字等于 i 的总和是 Si,那么您唯一好的最后一位数字是 n= S - Si + i。然后,您必须检查 n 是否介于 0 和 9 之间,以及结果数字是否在区间内。这将查找次数减少了 10 次。

您可以检查下一个第二个低位数字。
如果第一个 n 小于 0,则需要将第二个数字减少 -n。调用 n2 这个第二个数字。如果 n2 > = 0,好的数字将以 (n2,0), (n2 -1,1), ..., (0, n2) 结尾。这将复杂度降低了 100。 如果 n 大于 10,则将第二个数字增加 n-9。将 n2 称为第二个数字。如果 n2

您可以对第三个数字执行相同的操作,然后对第四个数字执行相同操作,直到 20。这将导致只有 1 个总和,并且复杂度为 O(解决方案的数量),因此它是最小的。对于编码,请注意您的第一个数字可能会发生变化。每组 20 个第一个数字进行一次计算。

【讨论】:

    【解决方案2】:

    蛮力法的一个理论改进:

    1) 对前k位求和,存入sumFirst
    2) 对最后 k 位求和,但如果总和超过 sumFirst,则停止。

    第 2 点可以省去总结最后几位数字的时间。

    但是您必须衡量额外的逻辑是否比简单地添加所有 k 位成本更高。

    【讨论】:

    • 如果原始问题清楚地表明“给定范围内的少数数字”是否存在其他限制,则还有很多改进方法。因此需要澄清这个问题。
    • 平均而言,这不会节省 50%。如果超过总和,通常会在接近尾声时发生,因此节省的费用将更接近于零。
    • @interjay 你是对的,我已经更新了。可能您无法通过算法手段提高蛮力。
    【解决方案3】:

    优化 N-k

    改进算法的一种方法是,如果具有 N 位数字的数字具有以下属性:
    N < 2k

    例如,如果 N = 5 和 k = 3,5 < 2x3,数字是

    abcde
    

    您只需将abde 计数(即无需检查k (3) 个数字,因为第 3rd 由 k-last 和 k-first 共享位数)。
    也就是说两边要计算的位数只有

    min(k, N-k), having N >= k
    

    【讨论】:

      【解决方案4】:

      如果您要对同一个数组多次使用,您可以将所有元素与之前的元素相加,即O(n),其中数组的大小为n,即

      for(int i = 1; i < n; i++)
           arr[i] = arr[i] + arr[i-1];
      

      这会将您的数组从probability density function 转换为cumulative distribution function(对于离散数字)。因此,您的查询将是 O(1)

      if(arr[k-1] == (arr[n-1]-arr[n-k])) //arr[k-1] is sum of first k element
          return true;
      return false;
      

      【讨论】:

        【解决方案5】:

        对蛮力的另一个改进:

        i = 0, T = 0
        while |T| < 9 * (k - i) 
          T = T + last[i] - first[i]
          i = i + 1
        return T == 0 
        

        【讨论】:

        • 如果它们相等,T 将在末尾为 0。如果一侧的总和超过剩余 (k - i) 位数的最大可能补偿,则 T 的绝对值将大于 9 * (k - i)。
        • 提供T的初始值
        • 我认为计算 abs(T) 的成本高于收益。
        猜你喜欢
        • 2020-05-12
        • 2013-03-05
        • 2020-11-11
        • 2013-08-06
        • 2021-01-16
        • 1970-01-01
        • 2020-04-09
        • 2021-05-02
        • 2011-01-06
        相关资源
        最近更新 更多