1 判断字符串中字符是否全都不同
问题描述
请实现一个算法,确定一个字符串的所有字符【是否全都不同】。这里我们要
求【不允许使用额外的存储结构】。给定一个string,请返回一个bool
值,true代表所有字符全都不同,false代表存在相同的字符。保证字符串中的
字符为【ASCII字符】。字符串的长度小于等于【3000】。
解题思路
这里有几个重点,第一个是ASCII字符,ASCII字符字符一共有256个,其中128
个是常用字符,可以在键盘上输入。128之后的是键盘上无法找到的。
然后是全部不同,也就是字符串中的字符没有重复的,再次,不准使用额外的
储存结构,且字符串小于等于3000。
如果允许其他额外储存结构,这个题目很好做。如果不允许的话,可以使用
golang内置的方式实现。
源码参考
通过strings.Count函数判断:
func isUniqueString(s string) bool {
if strings.Count(s, "") > 3000 {
return false
}
for _, v := range s {
if v > 127 {
return false
}
if strings.Count(s, string(v)) > 1 {
return false
}
}
return true
}
func isUniqueString2(s string) bool {
if strings.Count(s, "") > 3000 {
return false
}
for k, v := range s {
if v > 127 {
return false
}
if strings.Index(s, string(v)) != k {
return false
}
}
return true
}
源码解析
以上两种方法都可以实现这个算法。
第一个方法使用的是golang内置方法strings.Count,可以用来判断在一个字符
串中包含的另外一个字符串的数量。
第二个方法使用的是golang内置方法strings.Index和strings.LastIndex,用来判
断指定字符串在另外一个字符串的索引未知,分别是第一次发现位置和最后发
现位置。
2 翻转字符串
问题描述
请实现一个算法,在不使用【额外数据结构和储存空间】的情况下,翻转一个
给定的字符串(可以使用单个过程变量)。
给定一个string,请返回一个string,为翻转后的字符串。保证字符串的长度
小于等于5000。
解题思路
翻转字符串其实是将一个字符串以中间字符为轴,前后翻转,即将str[len]赋
值给str[0],将str[0]赋值str[len]。
源码参考
func reverseString(s string) (string, bool) {
str := []rune(s)
l := len(str)
if l > 5000 {
return s, false
}
for i := 0; i < l/2; i++ {
str[i], str[l-1-i] = str[l-1-i], str[i]
}
return string(str), true
}
源码解析
以字符串长度的1/2为轴,前后赋值
3 判断两个给定的字符串排序后是否一致
问题描述
给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否
变成另一个字符串。这里规定【大小写为不同字符】,且考虑字符串重点空
格。给定一个strings1和一个strings2,请返回一个bool,代表两串是否重
新排列后可相同。保证两串的长度都小于等于5000。
解题思路
首先要保证字符串长度小于5000。之后只需要一次循环遍历s1中的字符在s2
是否都存在即可。
源码参考
func isRegroup(s1, s2 string) bool {
sl1 := len([]rune(s1))
sl2 := len([]rune(s2))
if sl1 > 5000 || sl2 > 5000 || sl1 != sl2 {
return false
}
for _, v := range s1 {
if strings.Count(s1, string(v)) != strings.Count(s2, string(v)) {
return false
}
}
return true
}
源码解析
这里还是使用golang内置方法strings.Count来判断字符是否一致。
4 字符串替换问题
问题描述
请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足
够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时
保证字符串由【大小写的英文字母组成】。给定一个string为原始的串,返
回替换后的string。
解题思路
两个问题,第一个是只能是英文字母,第二个是替换空格。
源码参考
func replaceBlank(s string) (string, bool) {
if len([]rune(s)) > 1000 {
return s, false
}
for _, v := range s {
if string(v) != " " && unicode.IsLetter(v) == false {
return s, false
}
}
//return strings.ReplaceAll(s, "", "##"), true
res := strings.Replace(s, " ", "%20", -1)
return res, true
}