gpt4 book ai didi

java - 代码在 java 中正常工作,但相同的代码在 C 中的某些测试用例中失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:03 25 4
gpt4 key购买 nike

我在 HackerRank 网站上做算法题练习,我先用 C 语言提交了我的代码,但我得到了一些不正确的测试用例。我认为我的逻辑是正确的,所以我将代码移植到 Java 并通过了所有测试用例。

问题定义链接: https://www.hackerrank.com/challenges/caesar-cipher-1

这是我在 C 中的代码:

    int main(){
int n;
scanf("%d", &n);
char* s = (char *)malloc(n * sizeof(char));
scanf("%s", s);
int k;
scanf("%d", &k);
k = k % 26;
for(int i = 0; i < n; i++){
if(s[i] >= 65 && s[i] <= 90){
s[i] += k;
if(s[i] > 90){
s[i] = s[i] - 90 + 64;
}
}
if(s[i] >= 97 && s[i] <= 122){
s[i] += k;
if(s[i] > 122){
s[i] = s[i] - 122 + 96;
}
}
}
printf("%s", s);
return 0;
}

enter image description here

这是我的 Java 代码:

public class Solution {

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String str = br.readLine();
int K = Integer.parseInt(br.readLine());
K %= 26;
for(int i = 0; i < N; i++){
char c = str.charAt(i);
if(c >= 65 && c <= 90){
c += K;
if(c > 90){
c = (char)(c - 90 + 64);
}
}
if(c >= 97 && c <= 122){
c += K;
if(c > 122){
c = (char)(c - 122 + 96);
}
}
System.out.print(c);
}
}
}

enter image description here

我的两个解决方案都通过了示例测试用例,逻辑完全相同。我不明白为什么在某些测试用例中它在 C 中显示 W/A。

附言这是练习题解决方案,而不是现场比赛解决方案。

最佳答案

C 字符串以一个特殊的 '\0' 字符结束。因此,实际字符串总是比可见文本长 1 个字符。您没有为输入字符串空终止符分配内存:替换

char* s = (char *)malloc(n * sizeof(char));

char* s = malloc(n * sizeof(char) + 1);

甚至

char* s = malloc(n + 1);

因为 sizeof(char) 保证为 1

另外这些行会有问题:

if(s[i] >= 97 && s[i] <= 122){
s[i] += k;

s[i] 可能是 122k 可能远大于 5。由于 s[i] 很可能是有符号的 char 类型,它可能会溢出超过 127 的值,这是有符号 字符。并且有符号整数溢出具有未定义的行为

关于java - 代码在 java 中正常工作,但相同的代码在 C 中的某些测试用例中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38268255/

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