大学学习Golang遇到问题求助

大学学习Golang遇到问题求助 我正在学习Go语言,正在做这个练习:定义:字符串的压缩编码由一系列值对ch n定义,其中ch代表一个字符,而n>0是该ch字符重复的次数。

示例:字符串eeeaaaa对应值序列e 3 a 4,即字符’e’重复3次,后跟字符’a’重复4次。

编写一个程序,从命令行读取字符串的压缩编码,并在屏幕上打印解压后的字符串。

假设输入中给出的每个字符都属于英文字母表,因此使用US-ASCII标准(集成在Unicode标准中)编码。

同时假设命令行上指定的值序列格式正确,并且至少包含一个ch n对。

但是当我使用值a3 b1运行程序时,结果是:aaaabababababababababababababababababababababababababababababababababababababababababababababababababab

package main

import (
  "fmt"
  "unicode"
  "os"
  "strings"

)

func main (){

  c := os.Args[1:]
  char := ""
  var n, j int

  for _, cazz := range c {

      r := []rune(cazz)

      for _, dio := range r{

        if unicode.IsLetter(dio){

          char += string(dio)

        } else if unicode.IsNumber(dio){

            n += int(dio)
            j = n - 48
            anubi := strings.Repeat(char, j)
            fmt.Print(anubi)

           }
           /*anubi := strings.Repeat(char, j)
           fmt.Print(anubi)*/
        }

      }

  }

我认为问题出在else if unicode.IsNumber内部需要一个for循环。


更多关于大学学习Golang遇到问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你在打印序列后没有清除变量“char”和“n”, 在

fmt.Print(anubi)
char = ""
n = 0

更多关于大学学习Golang遇到问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的代码问题在于对数字的处理逻辑不正确。当遇到数字字符时,你直接将ASCII值累加到变量n中,这会导致重复次数计算错误。以下是修正后的代码:

package main

import (
	"fmt"
	"os"
	"unicode"
)

func main() {
	args := os.Args[1:]
	var result string
	var currentChar string
	var count int

	for _, arg := range args {
		runes := []rune(arg)
		
		for i := 0; i < len(runes); i++ {
			if unicode.IsLetter(runes[i]) {
				// 如果之前有字符和计数,先处理
				if currentChar != "" && count > 0 {
					result += repeatChar(currentChar, count)
				}
				// 重置当前字符和计数
				currentChar = string(runes[i])
				count = 0
			} else if unicode.IsNumber(runes[i]) {
				// 构建数字(处理多位数)
				count = count*10 + int(runes[i]-'0')
			}
		}
	}

	// 处理最后一个字符序列
	if currentChar != "" && count > 0 {
		result += repeatChar(currentChar, count)
	}

	fmt.Print(result)
}

func repeatChar(char string, count int) string {
	var result string
	for i := 0; i < count; i++ {
		result += char
	}
	return result
}

或者更简洁的版本:

package main

import (
	"fmt"
	"os"
	"strconv"
	"unicode"
)

func main() {
	args := os.Args[1:]
	var output string
	var char string
	var numStr string

	for _, arg := range args {
		for _, r := range arg {
			if unicode.IsLetter(r) {
				// 如果之前有字符和数字,先处理
				if char != "" && numStr != "" {
					n, _ := strconv.Atoi(numStr)
					output += strings.Repeat(char, n)
					numStr = ""
				}
				char = string(r)
			} else if unicode.IsNumber(r) {
				numStr += string(r)
			}
		}
	}

	// 处理最后一对
	if char != "" && numStr != "" {
		n, _ := strconv.Atoi(numStr)
		output += strings.Repeat(char, n)
	}

	fmt.Print(output)
}

关键修正点:

  1. 正确处理多位数(如"a12"中的12)
  2. 在遇到新字符时处理前一个字符的重复
  3. 使用int(runes[i]-'0')正确转换数字字符
  4. 添加了repeatChar辅助函数提高可读性

使用输入a3 b1时,现在会正确输出"aaab"。

回到顶部