当位置超出范围时如何从数组中选择一个值?

Posted

技术标签:

【中文标题】当位置超出范围时如何从数组中选择一个值?【英文标题】:How to select a value from an array when the location is out of bounds? 【发布时间】:2014-09-07 04:56:40 【问题描述】:

我正在尝试使用特定方法加密一些明文。给定一个密钥 [4,5,6,7] 和明文“这是一些明文” 第一个字母是 T 密钥中的第一个数字是 4 因此 T 通过向前移动变成 X 4 (T, U, V, W, X)字母是 H 键是 5 因此 H 变成 M H, I, J, K, L, M

当到达密钥的末尾时,只需从头开始并继续加密直到完成。我有一个 Python 的基本大纲:

#key = [4,5,12,6,7,11,8,9,1,2,3,10]
key = [4,5,6,7]
letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
plaintext = "IfyouarereadingthisthenthisplanetmayhavehopeafterallYouhavethepowerand"
plaintext = plaintext.upper()
keySpot = 0
count = 0;
keyCount = 0
letterLocation = 0
tempLetter = ""
i = 0

while(count < len(plaintext)):
    tempLetter = plaintext[count]
    for i in range(0, len(letters)):
        if(tempLetter == letters[i]):
            letterLocation = i
        i = i + 1

    if(keyCount > 4):
    keyCount = 0

letterLocation = letterLocation + key[keyCount]
keyCount = keyCount + 1

if(letterLocation > 27):
    #need some logic here so it wont go out of bounds

print letters[letterLocation]
count = count + 1

我的主要问题是,如果 letterLocation 在前进并超过 Z 时太大,该怎么办。当它到达 Z 时,我需要它从 A 处重新开始并继续前进直到完成。例如,如果明文字母为 Y,密钥为 5,Y 将变为 D Y, Z, A, B, C, D

我该怎么做?它可以是 Java、C、C++、javascript 或 Python,只要是最简单的。如果你能想出更好的方法,我会采纳建议的。

【问题讨论】:

对于初学者来说,数学中有一个叫做取模的运算符:en.wikipedia.org/wiki/Modulo_operation 你的问题缺少minimal reproducible example,因为你暴露了各种各样的东西而没有将其简化为简单的“当按一个值前进时,如何越过Z并从A重新开始? " 【参考方案1】:

嗯,这很简单,只需使用模数:

letterLocation = (letterLocation + key[keyCount]) % 26

【讨论】:

我现在要测试这个,但看起来它会起作用!感谢您抽出宝贵时间回答并阅读这个非常难以解释的问题 我猜我的代码在某个地方被破坏了,它最多可以工作 5 个字母然后开始表现得很愚蠢 高飞并不是那么有帮助。你的代码中还有那个 '>4' 吗? 您的缩进似乎不一致,您知道它在 Python 中的重要性。请发布与您的程序中完全相同的缩进代码(例如,您的 letterCount 增量应由一个选项卡标识)。

以上是关于当位置超出范围时如何从数组中选择一个值?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 致命错误:从数组中删除元素时索引超出范围

索引超出范围错误(从文件中读取的数组)

Swift 致命错误:数组索引超出范围

错误:索引超出了数组的范围。 [复制]

从firebase删除时数组索引超出范围

致命错误:在Swift中访问10个元素的数组时,数组索引超出范围