【Go】字符串趣题

文章目录

问题

给定一个字符串s和一个下标i,返回下标i对应的那个字节所在的字符。

字符串在Go中的底层是byte数组,Ascii范围内的字符使用一个字节表示,但是超过Ascii表示范围时字节数就不一定了,比如中文就是使用三个字节。但是,可以确定的是Go是采用UTF-8编码的,而UTF-8编码有如下规律

// UTF-8最多可用到6个字节, 实际位数最多有31位,即下表中x所表示的位
// 1字节 0xxxxxxx
// 2字节 110xxxxx 10xxxxxx
// 3字节 1110xxxx 10xxxxxx 10xxxxxx
// 4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
// 5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
// 6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

思路

1、找出字符第一个字节的规律
2、下标往前找到所求字符的第一字节位置,再往后找下一个字符的第一个字节位置

代码

// utf8中判断字节是否是字符第一个字节
// 1. ascii码(0-127)
// 2. 110xxxxxx 1110xxxx 等
func isFirstByte(c uint8) bool {
	return c < 128 || c >= 192
}

// GetRune 找到指定位置字符的起始下标以及长度
func GetRune(s []byte, index int) (start int, length int) {
	len := len(s)
	if index < len {
		return -1, -1
	}
	l, r := index, index+1
	for l >= 0 && !isFirstByte(s[l]) {
		l--
	}
	for r < len && !isFirstByte(s[r]) {
		r++
	}
	return l, r - l
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值