考虑一下我们只有<?= $browser['browser']; ?>
位数。现在我们必须找到一系列的N个数字。
{0,2,4,6,8}
我们怎样才能有效地做到这一点?
Series : 0,2,4,6,8,20,22,24,26,28,40.....
int start=0;
while(found!=n){
if(start is not odd)found++;
start+=2;
}
答案 0 :(得分:5)
你试图用5位数组成一个数字,所以这实际上是一个基数为5的数字,只是用一组奇怪的数字 - {0,2,4,6,8}代替{0,1 ,2,3,4}。请注意,所需数字集中的每个数字是基数为5的数字集的相应索引中的数字的两倍。因此,长话短说,您可以将N转换为基数5,然后将结果加倍。例如,Java(或C / C ++,有趣的是):
int createNumber(int n) {
int result = 0;
while (n > 0) {
result *= 10;
result += (n % 5);
n /= 5;
}
return result * 2;
}
答案 1 :(得分:1)
将0,2,4,6,8视为0,1,2,3,4,我们可以看到你需要计算N的基数为5的表示,然后相应地替换数字。时间复杂度为O(log5(N))
// N stores a value in base 10
// solution will have digits in an array
index = 0 ;
while (N != 0)
{
remainder = N % 5 ;
N = N / 5 ;
digit[index] = remainder * 2; //0 = 2*0, 2 = 2*1, 4=2*2, etc
index ++ ;
}
答案 2 :(得分:0)
详细说明:
转换N->N-1
以排除0
。
让A = {0, 2, 4, 6, 8}
让我们计算有多少个数字k
,(k > 1)
位数及其所有数字属于集合{0, 2, 4, 6, 8}
。可以4
方式选择第一个数字,以5
方式选择所有其他数字,总共4*pow(5, k-1)
。这意味着,如果m = ceil(log5(N))
,那么N
系列中的数字有m位数。
现在,如果base-5
的{{1}}表示中的第一个数字等于N
,i
,则我们答案中的第一个数字为(1 <= i <= 4)
。同样保持第二位数字等等。
因此,在您的算法中,您需要在A[i]
中展示N
,例如base-5
,其中每个N=abcde..
都在a,b,c
范围内,而您的回答将是映射每个[0..4]
- &gt;的结果a
答案 3 :(得分:-2)
您可以使用置换算法,然后按升序对其进行排序。使用此功能,即使您向样本空间添加更多数字,该系列仍然可以使用。见 - https://en.wikipedia.org/wiki/Heap's_algorithm
注意:对于这么简单的事情使用排列是过分的。但是如果你正在寻找一个可以占用更多数字并形成一个系列的算法,那么排列是一种很好的使用方法。