我给出了随机长度的随机序列,由0,1,2组成:
201102220221
我也给了一个数字:1或2. 我只能循环遍历序列,我需要识别我给出的数字的所有子序列,运行通过另一个函数的值,并将值添加到总和(初始化为0)。
任何0都可以用1或2代替。因此可以通过用数字替换它旁边的0来“扩展”子序列。如果子序列无法扩展到最小长度超过4,我需要丢弃它。
例如,假设我给出了序列:
11011002102
和数字1.我在开头识别长度为2的子序列(参见第一个元素)。通过用1代替第0个,第3个和第4个零,它可以扩展到长度为7的子序列。因此,我通过函数运行其当前长度并将其添加到总和中。
sum += function(2);
然后我确定1的下一个子序列(参见第四个元素)。它目前的大小为2,可以通过替换它周围的零来扩展到最大大小为7。所以我将它的长度传递给函数并将其添加到总和中。
sum += function (2);
我终于确定了1的最后一个子序列(参见第六个元素)。它目前的长度为1,可以扩展到最大大小为2,将其旁边的零替换为1,小于4,所以我将其丢弃。
有人可以帮助我编写一个功能,通过仅循环执行序列来执行上述操作。 请不要给我真实的代码,只是想法,建议或伪代码。
我没有任何工作要分享,我完全迷失了。我也不知道算法,所以请不要开始讨论动态编程或线性编程等问题,而是解释解决问题的可能方法。
答案 0 :(得分:1)
鉴于要求您只能遍历序列一次,您就知道代码的基本结构。
给定丢弃子序列(扩展长度为4或更多)和处理子序列(未扩展序列长度)的参数,您知道在此过程中需要跟踪哪些数据。根据您的环境和语言惯例,研究如何最好地存储这些数据。
在循环的每次迭代中,考虑输入序列的当前字符以及它如何影响存储的数据。
我试图在这里澄清问题,而不是只给你解决方案。随意提出更多问题。
编辑:
考虑如何逐步解决问题。以下是for循环的迭代:
1----------
好的,我们正在寻找1
,我们已经找到了一个。
-1---------
酷,另一个1
,现在我们的子序列长度增加到2
--0--------
是的,因为这不是1
,这个子序列的长度现在已知为2 - 它不会再增加,但因为这是0
,它可能会仍然有资格,如果它可以扩展到至少4.扩展的子序列长度现在是3
。
---1-------
扩展的子序列长度现在为4
!这意味着我们可以在通过function
之后将最后的序列长度添加到总和中。这也是另一个子序列的开始 - 因此子序列长度现在重置为1
,但扩展的子序列长度在4
仍然有效。这意味着这个子序列已经足够长,不会被拒绝,但我们还没有在这个阶段计算它的长度。
----1------
subsequence length
= 2
,expanded subsequence length
= 5
-----0-----
这标志着第二个子序列的结束,像以前一样处理它。等
------0----
-------2--- <- expanded subsequence length gets reset here
--------1-- <- start of another subsequence
---------0- <- expanded length is 2
----------2 <- expanded length is not long enough for this to qualify, discard it
所以,相当直接。我们需要跟踪两个因素:subsequence length
和expanded subsequence length
。
一旦你有了这个工作,想想这个输入序列“1010101”会发生什么。
答案 1 :(得分:1)
暂时忘掉电脑;把它想象成使用铅笔和纸的更快版本。
试着想象在遍历序列的每个元素时如何解决这个问题;您可能希望在每次迭代时在您的纸上写下和/或编辑(您在序列中到达的每个元素)。
例如:
Sequence = 11011002102
Index 0:
Value is 1
Current is 1, Previous was null
Tracking a subsequence of 1's starting at 0 => [1,0] = 1
Index 1:
Value is 1
Current is 1, Previous was 1
Current == Previous so the subsequence length is increased by 1 => [1,0] = 2
...