最近学校有个project让我纠结了一周。 我真的需要帮助。
我的程序接受一个字符串输入并修改它以返回另一个大写或小写版本的字符串,到目前为止它可以工作。但是当我输入时: “This is so exciting (up, 2)”输出保持不变,而应该是“This is SO EXCITING” 我的观点是能够处理这种情况:(up, n),知道“(up)”后面的单词必须大写。 如果在下面你会找到相关的功能。
提前致谢!
// modifyUp converts words before (up) to uppercase
func modifyUp(line string) string {
words := strings.Fields(line)
var numWords int
var numbers int
for i, word := range words {
if strings.HasSuffix(word, "(up)") && i > 0 {
// Convert word(s) to uppercase
numWords = 1
if strings.Contains(word, ",") {
// Handle comma-separated words
numbers, _ = strconv.Atoi(strings.TrimSuffix(strings.Split(word, ",")[1], ")"))
word = strings.TrimSuffix(word, fmt.Sprintf(",%d)", numbers))
numWords += numbers
} else {
word = strings.TrimSuffix(word, "(up)")
}
// Convert preceding word(s) to uppercase
for j := i - numWords + 1; j <= i; j++ {
if j >= 0 {
words[j] = strings.ToUpper(words[j])
}
}
// Replace modified word with original word
words[i-numWords+1] = word
}
}
return strings.Join(words, " ")
您的代码似乎正确识别了“(up)”后跟的单词并将它们修改为大写。但是,问题在于处理“(up, n)”中可选的第二个参数 n。
为了处理这种情况,需要修改代码,根据n的值统计转大写的单词个数。为此,您可以添加一个新变量来跟踪要转换的单词数,并检查当前单词是否是紧跟在“(up)”之后的单词。这是应该工作的代码的更新版本:
func modifyUp(line string) string {
words := strings.Fields(line)
var numWords int
var numbers int
var numWordsToConvert int
for i, word := range words {
if strings.HasSuffix(word, "(up)") && i > 0 {
// Convert word(s) to uppercase
numWords = 1
if strings.Contains(word, ",") {
// Handle comma-separated words
numbers, _ = strconv.Atoi(strings.TrimSuffix(strings.Split(word, ",")[1], ")"))
word = strings.TrimSuffix(word, fmt.Sprintf(",%d)", numbers))
numWords += numbers
} else {
word = strings.TrimSuffix(word, "(up)")
}
// Convert preceding word(s) to uppercase
numWordsToConvert = numWords
if i-numWordsToConvert > 0 && words[i-numWordsToConvert-1] == "(up)" {
// Get the number of words to convert based on the second argument
if i-numWordsToConvert-2 >= 0 && strings.Contains(words[i-numWordsToConvert-2], ",") {
// Handle comma-separated arguments
n, _ := strconv.Atoi(strings.Split(words[i-numWordsToConvert-2], ",")[1])
numWordsToConvert += n
} else if i-numWordsToConvert-1 >= 0 {
// Handle single argument
n, _ := strconv.Atoi(words[i-numWordsToConvert-1])
numWordsToConvert += n
}
}
for j := i - numWordsToConvert + 1; j <= i; j++ {
if j >= 0 {
words[j] = strings.ToUpper(words[j])
}
}
// Replace modified word with original word
words[i-numWords+1] = word
}
}
return strings.Join(words, " ")
}
并且此更新后的代码应正确处理“(up, n)”大小写并将适当数量的单词转换为大写。如果您还有其他问题,或者还有什么我可以帮忙的,请告诉我!
我终于找到了另一种方法
func modifyUp(line string) string {
words := strings.Fields(line)
//var numWords int
var numbers int
for i, word := range words {
if word == "(up," && i < len(words)-1 {
ok := splitWord(words[i+1])
if ok {
wr := words[i+1]
numbers, _ = strconv.Atoi(wr[:len(wr)-1])
words[i], words[i+1] = "", ""
for j := i - 1; j >= 0; j-- {
if numbers == 0 {
break
} else {
words[j] = strings.ToUpper(words[j])
numbers--
}
}
}
break
}
if word == "(up)" && i > 0 {
words[i-1] = strings.ToUpper(words[i-1])
words[i] = ""
}
}
return strings.Join(words, " ")
}
谢谢大家的贡献
如评论中所述,您正在专门检查
(up)
而不会检测到 (up, 2)
。检查这一点的一个简单方法是,您可以在 for 循环的开头放入一个fmt.Println(word)
来验证您正在检查的每个单词。在This is so exciting (up, 2)
的情况下,你得到
This
is
so
exciting
(up,
2)
如您所见,找到了
(up,
而不是(up)
。最重要的是,2)
与支票分开。
如果我们保持与您当前相同的逻辑,则快速解决方法如下:
func modifyUp(line string) string {
words := strings.Fields(line)
var numWords int
for i, word := range words {
if (strings.HasSuffix(word, "(up)") || strings.HasSuffix(word, "(up,")) && i > 0 {
// Convert word(s) to uppercase
numWords = 1
if strings.Contains(word, ",") {
var numbers int
// Handle comma-separated words
numbers, _ = strconv.Atoi(strings.TrimRight(words[i+1], ")"))
words[i] = ""
words[i+1] = ""
numWords = numbers
} else {
words[i] = ""
}
// Convert preceding word(s) to uppercase
for j := i - numWords; j <= i; j++ {
words[j] = strings.ToUpper(words[j])
}
}
}
return strings.Join(words, " ")
}
我对代码做了一些额外的更改,以便在您正确解析 up 后使其正常工作。您也可以删除
words[i-numWords+1] = word
,因为您已经在转换中替换了它。
希望这对您有所帮助,如果您有任何后续问题,请告诉我。