每天一道剑指offer-第一个只出现一次的字符
- 2019 年 10 月 4 日
- 筆記
题目
每天一道剑指offer-第一个只出现一次的字符
https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&tqId=11187&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目详述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
思路
- 字符串中的字符都是英文的字母,所以每一个字母都有一个ASCII码与其对应,然后建立一个字符数组长度是256,可以把每一个字符对应一个数组的下标
- 然后设立一个index!然后比如字符a第一次出现那么strArray[a字符对应的ASC码] = index;然后如果下一次a再出现了,那么strArray[a字符对应的ASC码] = -1;这样子做,只要字符出现了大于等于2次,都会这样子等于-1
- 而只出现一次的字符,由于index这个变量是每次递增的!我们只需要遍历一遍,找index最小的那个字符。
题目详解
public class Solution { public int FirstNotRepeatingChar(String str) { if(str.equals("")) return -1; int [] temp = new int[256]; int index = 1; char [] strArray = str.toCharArray(); for(int i=0;i<strArray.length;i++) { if(temp[(int)strArray[i]] == 0) { temp[(int)strArray[i]] = index; index++; }else{ temp[(int)strArray[i]] = -1; } }//这个循环就是遍历一遍,找到出现一次的字符 //只要index大于0就是出现一次的字符 int minIndex = Integer.MAX_VALUE; char ch = '1'; for(int i=0;i<temp.length;i++) { if(temp[i] > 0) { if(temp[i] < minIndex) {//找最小的index对应的字符 minIndex = temp[i]; ch = (char)i; } } } int result = -1; for(int i=0;i<strArray.length;i++) {//去找这个字符的下标! if(strArray[i] == ch) return i; } return -1; } }