题目
给定一个字符串,返回字符串中第一个不重复的字符,比如aBAd返回B,AbabcfA返回c,判断时不区分给定字符大小写,但返回时需要返回原本大小写(其实就是通过索引返回即可)。
思路
1、暴力破解
使用双重循环,声明一个变量保存字符出现的次数,
第二层循环中与第一层当前循环字符比较,如果相同字符出现次数++,
如果第二层循环遍历完以后字符出现次数为1,则代表找到了第一个不重复字符,
返回第一层循环下标位置对应的字符即可。
2、数组存储出现次数
使用一个长度为26的数组保存相应字符出现的次数,进行两次遍历,
第一次遍历字符串,统计字符出现的次数,
第二次遍历字符串,判断字符在数组中对应的值是否为1,
如果为1则代表当前字符为第一个不重复字符,返回即可。
不区分大小写:
可以先把字符串统一转换成小写用一个变量保存,后续比较操作这个变量即可;
也可以利用ASCALL码处理,小写a为97,大写A为65,两者相差32,
判断字符为小写还是大写,如果是小写,则字符对应的数组索引为[字符-'a'],
如果是大写,则字符对应的数组索引为[字符-'a'+32]。
代码
// 方法二 数组存储出现次数
func firstUniqChar(s string) byte {
if len(s) == 0{
return ' '
}
m := [26]int{}
for i := range s {
m[GetIndex(s[i])] += 1
}
for i := range s {
if m[GetIndex(s[i])] == 1 {
return s[i]
}
}
return ' '
}
func GetIndex(v byte) byte {
if v >= 65 && v < 97{
return v-'a'+32
}
return v-'a'
}
碎碎念
这是我在一场笔试中的第一个算法题,由于没休息好导致当天状态不是很好,思绪有些混乱,当时想了很久,最后还没把代码写出来,原因是近一年都在学习Golang,导致其他语言的基础语法都忘了,面试Golang岗位,结果偏偏不能用Golang来做题,而且碰到过两场这样的笔试了,真的是有点无语了。
反思自己,基础知识掌握的还不是很牢固,题还刷少了,也要补一下Java基础语法以应付笔试。加油!!!