有限状态机
例一
去除一个字符串中连续的空格,即"H__el___lo 变成 H_el_lo"
;
就是相当于使用
flag
定义了不同的状态,进行操作
复制func main() {
a := "h__el___lo"
str := []byte(a)
flag := 1
for _, v := range str {
switch flag {
case 0:
if v == byte('_') { //还不是字符串
} else { //是字符串
fmt.Print(string(v))
flag = 1
}
case 1: //是字符串
if v == byte('_') { //不是字符串
fmt.Print(string(v))
flag = 0
} else { //还是字符串
fmt.Print(string(v))
}
default:
fmt.Println("输入有误")
}
}
}
//输出结果
h_el_lo
例题二
除连续的空格但字符串中的连续空格不变,比如 h__el__\"wor___ld\"___lo
func main() {
a := "h__el__\"wor___ld\"___lo"
str := []byte(a)
flag1 := 1 //上一个是否是字符串
flag2 := 0 //是否在”“的里面
for _, v := range str {
if v == byte('"') { //修改 flag2 的值
if flag2 == 0 {
flag2 = 1
} else {
flag2 = 0
}
}
flag3 := (v == '_') //flag3不是字符串
switch flag1 {
case 0: //他上一个不是
switch flag2 {
case 0: //不在括号里
if flag3 { //也不是字符串
continue
}
flag1 = 1
fmt.Print(string(v))
case 1: //在括号里
fmt.Print(string(v))
continue //在括号内的都是原样输出
default:
fmt.Println("输出错误")
}
case 1: //他的上一个是字符串
switch flag2 {
case 0: //不在括号里
fmt.Print(string(v))
if flag3 { //不是字符串
flag1 = 0
}
case 1: //在括号里
fmt.Print(string(v))
default:
fmt.Println("输出错误")
}
default:
fmt.Println("输入错误")
}
}
}
//输出结果
h_el_"wor___ld"_lo
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?