任务是找到一个数字序列,可以通过某个数字转置或反转然后转置,嵌套在另一个相等或更大的数字集合中。输入来自文本文件。如果按原样或转置找到数字,则输出找到它的起始索引,如果它被反转或反转并转置,输出索引后跟倒置。
示例 - 如果要查找的数字是67654,则可以找到45432(向下换算2)或32345(倒置)或54567(倒置并向上换算2)
Input
67654
14676545
43234545679
905
#
第一行是搜索的内容(67654),其余行是搜索内容。
Output
3
7
10 inverted
14 inverted
我的想法是建立一个数字列表,如果要查找的数字和该数字反转,则每个数字之间的差异。例如67654会列出[-1,1,1,1]。然后,我会循环遍历字符串的每个数字,但使用滑动窗口检查它是否出现。我对倒置也做了同样的事情。
diffs = [int(name[x]) - int(name[x + 1]) for x in range(0, len(name) - 1)] #name stores the fist line of input
invertedName = ''.join([str(9-int(x)) for x in name])
currDiffs = []
for i in range(len(name)-1):
currDiffs.append(int(piece[i]) - int(piece[i+1])) #piece is the string being searched
for i in range(len(name)- 1, len(piece) - 1):
currDiffs.pop(0)
currDiffs.append(int(piece[i]) - int(piece[i+1]))
Compare(diffs,currDiffs) # check if theyre the same
这样做我的回答我发现自己几乎所有答案都不正确。关于如何修复我的方法或者如果出现问题的任何建议将不胜感激。
答案 0 :(得分:0)
这不是最高效的解决方案,但似乎有效:
def find_diffs(inval):
inval = map(int, inval)
plain = [i - inval[0] for i in inval[1:]]
return plain, [-i for i in plain]
def check(inval, against):
inval_diff, _ = find_diffs(inval)
print against, inval
for i in range(0, len(against) - len(inval) + 1):
test, inverted_test = find_diffs(against[i: i + len(inval)])
if test == inval_diff:
print i
elif test == inval_inverted_diff:
print i, "inverted"
inval = '67654'
check(inval, '14676545')
check(inval, '43234545679')
check(inval, '1467654543234545679905')
<强>输出强>
14676545 67654
2
43234545679 67654
1 inverted
5 inverted
1467654543234545679905 67654
2
6
9 inverted
13 inverted
这是做什么的?
这里的想法是,对于给定的输入,我们可以将输入转换为值列表,其中第一个值始终为0,其余值是它与第一个值之间的差值。例如:
1234 => 0, 1, 2, 3
5463 => 0, -1, 1, -2
6667 => 0, 0, 0, 1
我们可以类似地对任何数字进行比较。因此,为了比较,我们从我们正在比较的数字中取出前N个数字,其中N是源数字的长度。
在最后一个示例中,源编号为67654,因此长度为5. against
编号为1467654543234545679905,因此前5位为14676。
使用上述差异公式:
67654 => 0, 1, 0, -1, -2
14676 => 0, 3, 5, 6, 5
所以这不是一场比赛。你继续这样做,滑动against
数字的起始索引,直到你耗尽列表。
唯一需要考虑的是倒置。对于反向检查,您可以将差值列表中的每个数字乘以-1。偏移无关紧要,因为它是不变的。
如果您需要偏移值,事情会稍微复杂一些。