剑指offer34——第一个只出现一次的字符

  • 题目描述
    在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写,从0开始计数)。

  • 示例
    输入
    “google”
    返回值
    4

  • 思路分析
    本题最直接最容易想到的思路就是创建一个两层的循环,第一层循环固定一个目标字符,第二层循环从整个字符串中寻找是否有与目标字符相同的字符(注意第二层循环一定要刨除目标字符本身)。若存在相同字符,则第一层循环进入下一次循环;若不存在相同字符,则输出该目标字符的下标。本方法思路简单,但时间开销较大,时间复杂度为O(n²)。

  • 实现代码

public class Solution {
    public int FirstNotRepeatingChar(String str) {
        int position = -1;
        for (int i = 0; i < str.length(); i++) {
            for (int j = 0; j < str.length(); j++) {
                if(i == j) continue;
                position = i;
                if (str.charAt(i) == str.charAt(j)) {
                    position = -1;
                    break;
                }
            }
            if (position != -1) break;
        }
        return position;
    }
}

- 改进优化
若想降低时间上的开销,本题可以采用哈希表的方法解决。因为题目中规定输入的只能为字母并区分大小写,则对应的ASCII范围为65-122,其中A-Z对应的ASCII码为65-90,a-z对应的ASCII码值为97-122。利用这58个数值分别减去65后的值作为哈希表的index,即0-57。最终遍历一遍字符串,找出第一个数组内容为1的字母就可以了,时间复杂度为O(n)。

public class Solution {
    public int FirstNotRepeatingChar(String str) {
       int[] words = new int[58];
       for(int i = 0;i<str.length();i++){
           words[((int)str.charAt(i))-65] += 1;
       }
       for(int i=0;i<str.length();i++){
           if(words[((int)str.charAt(i))-65]==1)
               return i;
       }
       return -1;
       }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值