📜  检查数字是否有其他模式的位| Set-2 O(1)方法(1)

📅  最后修改于: 2023-12-03 15:26:46.722000             🧑  作者: Mango

检查数字是否有其他模式的位 | Set-2 O(1)方法

Set-1中,我们已经看到了一个线性时间复杂度的算法来检查数字是否存在任何模式,其中的任何两个相邻数字的第i位不同。现在,在本篇文章中,我们将看到一种O(1)时间复杂度算法,该算法可以在不使用循环或递归的情况下执行此操作。

注意:

  1. 在本篇文章中使用的算法只能检查数字是否具有模式,并给出了具有模式的数字,但对于不具有模式的数字,无法给出原因。此外,这个算法不能给出哪两个位不同。
  2. 本篇文章中使用的算法仅适用于整数。
算法

该算法依赖于以下前提:

  • 对于任何十进制数字$N$,$N mod 10$将返回最右边的数字。
  • 对于任何十进制数字$N$,$N / 10$将返回删除最右边数字后的新数字。例如,如果$N = 1234$,那么$N / 10 = 123$。
  • 对于两个数字$X$和$Y$,$X \oplus Y$必须是$10^n - 1$的形式,其中$n$是非负整数,或其中一个数字等于0。例如,对于$X = 1010$和$Y = 0101$,$X \oplus Y = 1111$,而$10^n - 1 = 1111$(当$n = 4$时)。

基于这些前提,我们可以编写以下算法:

  1. 计算$N_1 = N mod 10$
  2. 取$N / 10$的下一个数字$N_2$,如果不存在,则返回$true$
  3. 取$N / 10$的下一个数字$N_3$,如果不存在,则返回$(N_1 \oplus N_2)$等于0
  4. 取$N / 10$的下一个数字$N_4$,如果不存在,则返回$(N_1 \oplus N_2) \oplus (N_3 \oplus N_2) = (N_1 \oplus N_3)$等于0
  5. 以相同的方式继续计算直到数字的第一位

该算法可以通过以下python代码实现:

def isPatternPresent(N):
    N1 = N % 10
 
    # check if pattern exists in the number
    while(N >= 10):
        N = N // 10
        N2 = N % 10
 
        N = N // 10
        N3 = N % 10
 
        N = N // 10
        N4 = N % 10
 
        if (N1 ^ N2) != 0 and (N2 ^ N3) != 0 and (N3 ^ N4) != 0:
            return False
 
    return True
示例

让我们看一些示例来理解此算法的工作原理。

| Number | Result | | ------ | ------ | | 12345 | false | | 101 - 5 | false | | 12321 | true | | 1023454321 | true |

性能分析

在本篇文章中使用的算法的时间复杂度为$O(1)$,因为在循环中执行的操作数是恒定的。而且,算法空间复杂度为$O(1)$,因为我们只需要为变量分配固定的内存。因此,对于对于检查数字是否有其他模式的位,此解决方案是最好的。

总结

在本篇文章中,我们看到了一种线性时间复杂度算法来检查数字是否存在任何模式。此外,我们还看到了一种$O(1)$时间复杂度算法来完成此操作。虽然$O(1)$时间复杂度算法只适用于整数,但在特定情况下非常有用。因此,我们可以根据我们的要求选择合适的算法。