Go--字符串方法


一、字符串的操作方法

1len(str)  --- 统计字符串长度
2、r := []rune(str) --- 字符串遍历同时处理有中文的问题
3、n, err := strconv.Atoi(str)   ---- 字符串转整数
4、str = strconv.Itoa(被转后的数字) --- 整数转字符串
5var bytes = []byte(str)   --- 字符串转[]byte
6、strings.Contains("字符串one", "字符串two") --- 查找字符串two是否在字符串one中返回bool7、strings.count("字符串one", "字符串two")  ----  统计字符串two在字符串one中出现的次数
89

1.1统计字符串的长度 len()

  • 统计字符串的长度,按字节len(str)
  • golang的编码统一都是utf-8(ascii的字符(字母和数字)占一个字节,汉字占用三个字节)
	strOne := "老王"
	strtwo := "laowang"
	fmt.Println(len(strOne)) // 6
	fmt.Println(len(strtwo)) // 7

1.2、字符串遍历,同时处理有中文的问题

  • 大家好奇为什么要这样呢?直接类似python和java一样循环打印不就行了吗,答案是go不支持这样直接遍历,需要转换
  • Golang中所有的字符都是以utf-8编码存储的,对于中文字符来说,一个中文字符占3个字节。用传统方式输出的话会出现中文乱码,原因是传统方式是以字节的方式进行遍历的,而中文字符占了3个字节
    例如直接遍历字符串
	strtest := "laowang 你是一个好人"
	for i := 0; i < len(strtest); i++ {
		fmt.Printf("%c", strtest[i])  // 输出的是乱码

	}

1.2.1、遍历带有中文的字符串方式一: str = []rune(str)

	//字符串遍历,同时处理有中文的问题 r := []rune(str)
	str2 := "hello北京"
	r := []rune(str2)
	for i := 0; i < len(r); i++ {
		fmt.Printf("字符=%c\n", r[i])
	}

1.2.2、方式二使用for…range

strtest := "laowang 你是一个好人"
for index, val := range strtest {
		fmt.Printf("%d, %c", index, val)
	}

1.3、字符串转整数:strconv.Atoi(str)

  • strconv.Atoi(str), 传递进来一个只有数字的字符串,返回的是int类型和err信息
	// 字符串转整数
	// strconv.Atoi(str), 传递进来一个只有数字的字符串,返回的是int类型和err信息
	n, err := strconv.Atoi("123")  // n就是转化后的int数值
	if err != nil { // nil可以暂时理解为null
		fmt.Println("转换有误", err)
	} else {
		fmt.Println("转换的成果是: ", n)
	}

1.4、整数转字符串 :strconv.Itoa(int)

  • strconv.Itoa(int), 传递一个int类型返回str
	strnum := strconv.Itoa(123)
	fmt.Println("转化后的字符串", strnum) // 转化后的字符串 123
	fmt.Printf("类型是: %T", strnum) //string
	

1.5、字符串 转 []byte: var bytes = []byte(str)

	var bytes = []byte("hello go")
	fmt.Printf("bytes=%v\n", bytes)  // 输出的是ascii码

1.6、[]byte 转 字符串: str = string([]byte{byte, byte, byte})

	str := string([]byte{97, 98, 99})
	fmt.Println(str) // abc

1.7、//查找子串是否在指定的字符串中: strings.Contains()

  • strings.Contains(“被查的总字符串”,“要查的字符串”)
fmt.Println(strings.Contains("laowang123", "laow"))  // true

1.8、统计一个字符串有几个指定的子串 : strings.Count(“str”, “substr”)

  • strings.Count(“sunstr”, “str”) 返回的是int
	fmt.Println(strings.Count("老王", "王"))     // 1
	fmt.Println(strings.Count("lwaong", "王")) // 0
	fmt.Println(strings.Count("老王头王", "王")) // 2

1.9、strings.EqualFold(str1,str2),不区分大小写的字符串比较(==是区分字母大小写的)

	strnumone := "laowang"
	strnumtwo := "Laowang"
	fmt.Println(strnumone == strnumtwo) // false
	fmt.Println(strings.EqualFold(strnumone, strnumtwo))  // true

1.10、返回子串在字符串第一次出现的index值,如果没有返回-1 :

	fmt.Println(strings.Index("我是老王头", "王"))      // 9, 因为中文占三个字节所以第十位下标是9
	fmt.Println(strings.Index("laowangtou", "w")) // 3
	fmt.Println(strings.Index("老王头", "你")) // -1

1.11、strings.LastIndex()返回子串在字符串最后一次出现的index,

	fmt.Println(strings.LastIndex("老王头", "王"))     // 3
	fmt.Println(strings.LastIndex("laowang", "a")) // 4 
	fmt.Println(strings.LastIndex("老王是你", "不"))  // -1

1.12、将指定的子串替换成 另外一个子串: strings.Replace()

  • 将指定的子串替换成 另外一个子串: strings.Replace(总字符串, 替换的值,替换后的值,替换的次数)
  • strings.Replace(“字符串”, ''要替换的字符", “替换后的值” -1 )-1 代表全部替换
	fmt.Println(strings.Replace("gogo hello", "go", "go语言", 2)) // go语言go语言 hello , 将gogohello这个字符串的go都替换成go语言,替换两次

	fmt.Println(strings.Replace("gogogogo", "go", "go语言", -1))  // -1代表全部替换

1.13、字符串转化为数组 string.Split()

  • 和python一样使用split切割,将字符串按照某个字符切割为数组
  • 格式:
    • strings.Split(str, “按照某个字符切割”)
	strSeptember := "老王,你可,少点,套路吧"
	var arr []string = strings.Split(strSeptember, ",")
	fmt.Println(arr) // []string
	fmt.Printf("%T\n", arr)  // [老王 你可 少点 套路吧]

----------

	//strings.Split("hello,wrold,ok", ",")
	strArr := strings.Split("hello,wrold,ok", ",")
	for i := 0; i < len(strArr); i++ {
		fmt.Printf("str[%v]=%v\n", i, strArr[i])
	} 
	fmt.Printf("strArr=%v\n", strArr)

1.14、将字符串的字母进行大小写的转换:

  • strings.ToUpper (str) # 将字符串中的小写字母全部大写
  • strings.ToLower (str) # 将字符串中的大写字母全部小写
	strUpper := "laowang是一个大流氓"
	strUpperto := strings.ToUpper(strUpper) //全部大写, 是有返回值的 必须用一个str元素接收
	fmt.Println(strUpperto)                 // LAOWANG是一个大流氓

	strLower := "LAOWANG住在隔壁"
	strLowerto := strings.ToLower(strLower)  // 全部小写
	fmt.Println(strLowerto) // laowang住在隔壁

1.15、将字符串左右两边的空格去掉: strings.TrimSpace(str)

  • strings.TrimSpace(str)
	strTrim := " kongge "
	fmt.Println(strings.TrimSpace(strTrim))

1.16、将字符串左右两边指定的字符去掉

  • strings.Trim(“str”, “要去除的字符”)
	strTrim := "alaowanga"
	fmt.Println(strings.Trim(strTrim, "a")) //laowang

1.17、只去除左边的指定字符

  • strings.TrimLeft(str, cutsetstr)
strTrim := "alaowanga"
fmt.Println(strings.TrimLeft(strTrim, "a")) //laowanga ,  去除左边的a字符

1.18、只去除右边的指定字符

  • strings.TrimRight(str,cutset )
strTrim := "alaowanga"
fmt.Println(strings.TrimRight(strTrim, "a")) //alaowang 去除右边的a字符

1.19、查询字符所在的下标 index

  • 查不到返回-1
	strIndex := "老王"
	fmt.Println(strings.IndexAny(strIndex, "王")) //3 
	fmt.Println(strings.Index(strIndex, "王"))  // 3
	strIndexA := "俺是Laowang老王头"
	fmt.Println(strings.Index(strIndexA, "h")) //  -1

1.17、判断字符串是否以指定的字符串开头: strings.HasPrefix

  • strings.HasPrefix(str,prefix) 返回bool值

	strIndexA := "俺是Laowang老王头"

	fmt.Println(strings.HasPrefix(strIndexA, "a"))
	fmt.Println(strings.HasPrefix(strIndexA, "俺"))
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 题目描述 给定一个字符串S和一个子串T,在S中删除所有T的出现。 输入格式 第一行输入一个字符串S,长度不超过100。 第二行输入一个子串T,长度不超过10。 输出格式 输出删除后的字符串。 样例输入 They are students. the 样例输出 y are studnts. 算法1 (暴力枚举) $O(n^2)$ blablabla 时间复杂度 参考文献 Python 代码 算法2 (暴力枚举) $O(n^2)$ blablabla 时间复杂度 参考文献 C++ 代码 算法3 (暴力枚举) $O(n^2)$ blablabla 时间复杂度 参考文献 Java 代码 算法4 (暴力枚举) $O(n^2)$ blablabla 时间复杂度 参考文献 C# 代码 算法5 (暴力枚举) $O(n^2)$ blablabla 时间复杂度 参考文献 Go 代码 算法6 (暴力枚举) $O(n^2)$ blablabla 时间复杂度 参考文献 Scala 代码 算法7 (暴力枚举) $O(n^2)$ blablabla 时间复杂度 参考文献 JavaScript 代码 算法8 (暴力枚举) $O(n^2)$ blablabla 时间复杂度 参考文献 Ruby 代码 算法9 (暴力枚举) $O(n^2)$ blablabla 时间复杂度 参考文献 Swift 代码 算法10 (暴力枚举) $O(n^2)$ blablabla 时间复杂度 参考文献 Kotlin 代码 ### 回答2: 题目描述: 给定一个字符串 S 和一个被删除的字符串 T,请输出 S 中所有满足条件的子串。 我们称 T 是 S 的一个拓扑子序列,若 S 删除若干个字符(也可以不删除)得到的序列恰好是 T。 例如,S = "abbcd",T = "abc",则 T 是 S 的拓扑子序列,因为 S 删除 b 和 d 后得到 "abc"。 输入描述: 两个字符串 S 和 T,且 S 的长度不超过 1000,T 的长度不超过 10。 输出描述: 按字符串的顺序,依次输出 S 中所有满足条件的子串,每个子串占一行。如果没有符合条件的子串,则输出一行 ""(不含引号)。 示例: 输入: 7-29输入示例 输出: 7-29输出示例 思路分析: 给定一个字符串S和一个要删除的字符串T,求S中全部符合条件的子串。 拓扑子序列:一个字符串 S 和一个删除的字符串 T,S删除若干个字符(也可以不删除)得到的序列恰好是 T。假设 S = "abbcd",T = "abc",此时 T 是 S 的拓扑子序列,因为 S 删除 b 和 d 后得到 "abc"。 对于一个字符串S,我们可以从左向右遍历,遇到一个字符等于T的第一个字符,就开始判断是否符合条件,直到找到最后一个字符相等或者找到T的最后一个字符(如果中间出现了不符合条件的字符,则中断)。如果是符合条件的,就把对应的子串输出,中间的字符不能超过10个。 代码实现: 首先输入字符串S和要删除的字符串T,由于有多组输入数据,我们使用while循环来进行多次输入输出。接下来我们从左向右遍历S,遇到一个字符等于T的第一个字符,就开始判断是否符合条件,一直到找到最后一个字符或者找到了T的最后一个字符。如果是符合条件的,就把对应的子串输出。注意,输出所有符合条件的子串之后,需要在最后增加一个空字符串""。 ### 回答3: 这道题目要求我们实现一个函数,删除给定字符串中出现的指定子串。可以使用两种方式实现,一种是暴力匹配,一种是KMP算法。 暴力匹配的实现方式是,枚举原始字符串中的每一个字符,如果当前字符和要删除的子串的第一个字符相等,就比较接下来的字符是否也相等,如果完全匹配,就将该子串删除,然后继续循环匹配,直到找到所有的子串并删除完成。 KMP算法的实现方式是,首先针对要删除的子串构建一个next数组,指示每个位置上一次匹配失败后应该从哪个位置重新开始匹配。然后对原始字符串进行查找,每次根据next数组的值判断要往后移动的距离,从而能够在O(N)的时间复杂度内找到所有的子串并删除。 无论是暴力匹配还是KMP算法,都需要实现一个删除子串的函数。这个函数可以使用常规的字符串操作实现,即将原始字符串分成要删除的子串的左边和右边,然后合并成新的字符串即可。 总的来说,这道题目的难点不在于实现算法,而在于理解算法的原理以及对字符串操作的熟练度。所以需要多做一些字符串操作的习题,多练习算法实现的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lovely_red_scarf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值