我有一个字符列表,比如x,用 b[1], b[2], b[3] ... b[x]
表示 . 在 x
之后,
-
b[x+1]
是该顺序中b[1],b[2].... b[x]
的串联 . 同样的, -
b[x+2]
是b[2],b[3]....b[x],b[x+1]
的串联 . -
所以,基本上,
b[n]
将是b[i]
的最后x
项的连接,从右边开始 . -
给出
p
和q
作为查询的参数,如何找出b[p]
中b[p]
的q
字符对应的哪个字符?
所有查询都修复 Note: x
和 b[1], b[2], b[3]..... b[x]
.
我尝试了强制执行,但是对于大的x,字符串长度呈指数增长 . (x <= 100) .
Example:
- 当
x=3
时,
b[] = a, b, c, a b c, b c abc, c abc bcabc, abc bcabc cabcbcabc, //....
//Spaces for clarity, only commas separate array elements
- 因此,对于
p=7
,q=5
,answer返回的查询将是3
(对应于字符'c'
) .
我只是很难搞清楚它背后的数学 . 语言没有问题
1 回答
当我想出来的时候,我写下了这个答案,所以请耐心等待 .
正如您所提到的,更容易找出
b[p][q]
中的字符来自原始x
字符,而不是为大p
生成b[p]
. 为此,我们将使用循环来查找当前b[p][q]
的来源,从而减少p
,直到它在1
和x
之间,并且q
直到1
为止 .让我们看一下
x=3
的示例,看看我们是否可以得到一个公式:序列清晰:
N(p) = N(p-1) + N(p-2) + N(p-3)
,其中N(p)
是b
的第p个元素中的字符数 . 给定p
和x
,您可以强制计算范围[1, p]
的所有N
. 这将允许您找出b
b[p][q]
的哪个先前元素 .为了说明,比如
x=3
,p=9
和q=45
.上面的图表给出了
N(6)=9
,N(7)=17
和N(8)=31
. 自45>9+17
以来,您知道b[9][45]
来自b[8][45-(9+17)] = b[8][19]
.迭代/递归地继续,
19>9+5
,所以b[8][19] = b[7][19-(9+5)] = b[7][5]
.现在
5>N(4)
但5<N(4)+N(5)
,所以b[7][5] = b[5][5-3] = b[5][2]
.b[5][2] = b[3][2-1] = b[3][1]
自
3 <= x
以来,我们有终止条件,b[9][45]
是c
来自b[3]
.从
p
,q
,x
和b
到x
开始,可以非常容易地递归计算或者迭代计算这样的东西 . 我的方法需要p
数组元素来计算整个序列的N(p)
. 如果递归地工作,这可以在数组中或在堆栈上分配 .这是vanilla Python中的参考实现(没有外部导入,虽然numpy可能有助于简化这一点):
调用
so38509640('abc', 9, 45)
产生同样,对于问题中的示例,
so38509640('abc', 7, 5)
会产生预期结果:抱歉,我无法想出一个更好的函数名称:)这是一个简单的代码,它应该在Py2和3中同样有效,尽管
range
函数/类有差异 .我很想知道是否存在针对此问题的非迭代解决方案 . 也许有一种方法可以使用模运算或其他方法来做到这一点......