Golang简单回文程序在在线判题系统中显示错误答案

Golang简单回文程序在在线判题系统中显示错误答案 这是我的代码:

package main

import (
	"fmt"
)

func isPalindrome(value *string) bool {
	for i, j := 0, len(*value)-1; i < j; i, j = i+1, j-1 {
		if (*value)[i] != (*value)[j] {
			return false
		}
	}
	return true
}

func main() {
	var n, count int16
	var num string
	for fmt.Scanf("%v", &n); n > 0; n-- {
		fmt.Scanln(&num)
		if isPalindrome(&num) {
			count++
		}
	}
	fmt.Println(count)
}

这是一个来自Problem - A - Codeforces的简单回文问题。 问题在于在线判题系统显示上述代码对于以下输入给出了错误答案:

4 3 546 74647 74565

在线尝试!

在线判题结果: com_gym_102416_my%20(1)

这真的很奇怪,因为当我使用上述输入运行代码时,我得到了正确答案 2,但当在线判题系统运行时,它给出了 3。我使用的是 Go 版本 1.13,但在线判题系统运行的是版本 1.12。这两个 Go 版本之间是否存在某些差异可能导致此问题?还是这是在线判题系统的问题?


更多关于Golang简单回文程序在在线判题系统中显示错误答案的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复
  • 在你的Scanf格式字符串中加入一些\n
  • 重新考虑这个函数(为什么用指针?简化循环,那里不需要两个变量)。

更多关于Golang简单回文程序在在线判题系统中显示错误答案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这已经不是第一次了,我遇到了在线判题系统的问题,它只说有错误,却不显示输出到底哪里错了,或者像这次这样,显示的输出与应该打印的内容完全不同。

你的代码在处理输入时存在一个常见问题:fmt.Scanf("%v", &n) 不会消耗输入缓冲区中的换行符。当后续使用 fmt.Scanln(&num) 读取字符串时,第一个 num 可能会读取到空字符串或残留的换行符,导致回文判断出错。

以下是修正后的代码:

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func isPalindrome(s string) bool {
	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
		if s[i] != s[j] {
			return false
		}
	}
	return true
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	
	var n int
	fmt.Fscan(reader, &n)
	
	count := 0
	for i := 0; i < n; i++ {
		num, _ := reader.ReadString('\n')
		num = strings.TrimSpace(num)
		if isPalindrome(num) {
			count++
		}
	}
	fmt.Println(count)
}

关键修改:

  1. 使用 bufio.Reader 确保精确读取每一行
  2. strings.TrimSpace() 移除换行符和空格
  3. 简化 isPalindrome 函数,直接传递字符串而非指针
  4. 使用 fmt.Fscanbufio.Reader 读取整数

对于示例输入:

4
3
546
74647
74565

修正后的代码会正确输出 2(只有 “3” 和 “74647” 是回文)。

回到顶部