gpt4 book ai didi

java - 按值 x 递增,但它会按值 x-1 递增

转载 作者:行者123 更新时间:2023-11-30 23:49:51 31 4
gpt4 key购买 nike

我正在实现一个算法,当用户输入字符串时,字符串中的每个字符(如果是字母表)都应该增加给定的值(这里是旋转器)。我正在玩这个代码 2 小时,但无法弄清楚为什么当我按值旋转器递增时,它会按 rotator-1 递增。

public class Solution {

public static void main(String[] args) {
/* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
Scanner in = new Scanner(System.in);
int length = in.nextInt();
String input = in.next();
int nextvalue = 0;
int temp = 0;
char array[] = input.toCharArray();
int rotator = in.nextInt();
for(int i = 0; i < length; i++){
if((array[i] >= 'a' && array[i] <= 'z') || (array[i] >= 'A' && array[i] <= 'Z')){
nextvalue = (int)array[i] + rotator;
array[i] = (char)nextvalue;

if((int)array[i] > (int)'z'){
temp = (int)array[i] - (int)'z';
nextvalue = (int)'a' + temp -1;
array[i] = (char)nextvalue;
}
else if((int)array[i] > (int)'Z'){
temp = (int)array[i] - (int)'Z';
nextvalue = (int)'Z' + temp -1;
array[i] = (char)nextvalue;
}
}
}
System.out.println(array);
}
}

如果有两个 if 语句要处理(溢出条件)如果字母是 > z 或 >Z。现在,如果我删除这两个语句,除了溢出条件之外的所有内容都会正确打印

(没有溢出条件)示例 I/P:

11 <- 字符串长度

中音

2 <- 旋转器

示例 O/P :

okffng-Qwv| <- 溢出条件未处理

(有溢出条件)示例 I/P:

11

中音

2

示例 O/P :

njeemf-Qvub <- 溢出已处理,但其他所有内容均由旋转器递增 - 1 除了“Q”

为什么会这样?我还在 inner if condition 中使用 print 语句进行了检查,因为只有一个溢出条件,它只对该输入执行一次

感谢帮助/建议。谢谢。

最佳答案

我认为处理溢出情况的最简单方法是使用取模运算符让字符环绕任意次数以落在当前逻辑位置。这样的事情应该有效:

for (int i=0; i < length; i++) {
if (array[i] >= 'a' && array[i] <= 'z') {
int currDiff = (int)array[i] - (int)'a';
int newPos = (int)'a' + ((rotator + currDiff) % 26);
array[i] = (char)newPos;
}
else if (array[i] >= 'A' && array[i] <= 'Z') {
int currDiff = (int)array[i] - (int)'A';
int newPos = (int)'A' + ((rotator + currDiff) % 26);
array[i] = (char)newPos;
}
}

我使用 abcdefg 的输入字符串和 51 的 rotator 值测试了这段代码,它返回了 zabcdef。这是意料之中的,因为我们轮换了一步,还差两轮完整的轮换。因此,a 在旋转一圈后落在 z 上,随后的字符也跟着落下。

请注意,这里有一种更好的处理字符位置演算的方法,但这个答案与您在原始问题中的处理方式保持一致。

最后说明:

模数运算符 % 返回前面它和继续它的数的除法的余数 .在我上面给出的解决方案中,我采用有效旋转器 % 26。这里,有效旋转器是字母与 aA plus 的当前距离 无论我们要旋转多少步。通过将这个数字取模 26,我们总是会得到 0 到 25 之间的数字。因此,我们总是从 aA 开始采取 0 到 25 步,这是您希望在程序中的行为。

关于java - 按值 x 递增,但它会按值 x-1 递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42608943/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com