首页 > 试题广场 >

第一个只出现一次的字符

[编程题]第一个只出现一次的字符
  • 热度指数:561165 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)


数据范围:,且字符串只有字母组成。
要求:空间复杂度 ,时间复杂度
示例1

输入

"google"

输出

4
示例2

输入

"aa"

输出

-1
题目各种坑...
class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        if(str.length()==0)
            return -1;
        int hash[256]={0};
        int i=0;
        while(str[i]!='\0'){
            hash[str[i]]++;
            ++i;
        }
        i=0;
        while(str[i]!='\0'){
            if(1==hash[str[i]]){
                return i;
            }
            i++;
        }
        return -1;
    }
};

发表于 2015-07-27 10:58:12 回复(25)
python简单方法:
class Solution:
    def FirstNotRepeatingChar(self, s):
        # write code here
        if len(s)<0:
            return -1
        for i in s:
            if s.count(i)==1:
                return s.index(i)
                break
        return -1
书中所述创建哈希表,下标为ACII值,值为出现次数
#建立哈希表,字符长度为8的数据类型,共有256种可能,于是创建一个长度为256的列表
        ls=[0]*256
        #遍历字符串,下标为ASCII值,值为次数
        for i in s:
            ls[ord(i)]+=1
        #遍历列表,找到出现次数为1的字符并输出位置
        for j in s:
            if ls[ord(j)]==1:
                return s.index(j)
                break
        return -1

编辑于 2017-10-19 17:01:38 回复(15)
python
#方法一:利用数组自己建立个哈希表
class Solution:
    def FirstNotRepeatingChar(self, s):
        # write code here
        if s==' ':
            return -1
        hashtable=[0]*256
        for i in s:
            hashtable[ord(i)] += 1
        for i in s:
            if hashtable[ord(i)]==1:
                return s.index(i)
        return -1

#方法二:利用python自带的字典
class Solution:
    def FirstNotRepeatingChar(self, s):
        # write code here
        if s==' ':
            return -1
        d=dict()
        #第一次遍历字符串,将每个字符的次数存入字典
        for i in s:    
            d[i]=d.get(i,0)+1
        #第二次遍历字符串,检查每个字符出现的次数
        for i in s:
            if d[i]==1:   #O(1)
                return s.index(i)
        return -1

发表于 2019-03-23 21:29:36 回复(5)
几个坑:
1.题目表述不清楚:到底返回神马东西?字符位置还是字符的ASCII值?
2.测试用例不和题目:题目要求是全部大写字母,给个"google"作为测试是几个意思?
3.返回值没有说明,字符串空串为什么返回是-1?
OL:出题目不带的这样让写代码的乱猜的

补上一个Java AC代码:
public class Solution {
public int FirstNotRepeatingChar(String str) {
        if (str.length() == 0) {
            return  -1;
        }
        char c = 'A';
        if(str.charAt(0) >= 'a'){
            c = 'a';
        }
        int[] counts = new int[26];
        for (int i = 0; i < str.length(); i++) {
            counts[str.charAt(i) - c]++; 
        }
        for (int i = 0; i < str.length(); i++) {
            if (counts[str.charAt(i) - c] == 1){
                return i;
            }
        }
        return -1;
    }
}

编辑于 2016-08-31 10:18:35 回复(18)
    def FirstNotRepeatingChar(self, s):
        if s == "":
            return -1
        else:
            counts = {}
            for i in s:
                if i not in counts:
                    counts[i] = 1
                else:
                    counts[i] += 1
            for index,i in enumerate(s):
                if counts[i] == 1:
                    return index

发表于 2017-07-11 17:56:48 回复(9)
class Solution {
public:
//坑爹啊,说长度在1<=length<=1000的,结果放了个空,返回-1.
//说是大写字母,结果给个google什么意思。还是做了个256的hash表。
    int FirstNotRepeatingChar(string str) {
        unsigned int ch[256]={0};
        if(str.length()<=0) return -1;
        for(int i=0;i<str.length();i++)
        {
                ch[(int)str[i]]++;
        }
        for(int i=0;i<str.length();i++)
        {
            if(ch[(int)str[i]]==1)
                return i;
        }
        return -1;
    }
};

发表于 2016-07-21 09:56:08 回复(1)
import java.util.HashMap;
import java.util.Map;

/**

*
* 方法一 : 用hashmap的性质,因为containsKey是O(1)
*
*
* 方法二: 桶排序,用两个桶保存,一个保存index,一个保存出现次数
*/
public class FirstNotRepeatingChar {

public int firstNotRepeatingChar(String str) {
if (str == null || str.length() == 0 ) {
return -1;
}
        Map<Character, Integer> map = new HashMap<>();
char[] arr = str.toCharArray();
for (int i = 0; i < arr.length; i++) {
if(!map.containsKey(arr[i])) {
map.put(arr[i], i);
} else {
map.put(arr[i], 10001);
}
}
int index =  10001;
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
if (entry.getValue() < index) {
index = entry.getValue();
}
}
return index == 10001 ? -1 : index;
}

//方法二,桶排序,假设只存在大小写字母
public int firstNotRepeatingChar2(String str) {
if (str == null || str.length() == 0 ) {
return -1;
}
int [] arr = new int[200];
int [] arr2 = new int[200];
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
arr[chars[i]] ++;
arr2[chars[i]] = i;
}
int index = 10001;
for (int i = 0; i < arr.length; i++) {
if(arr[i] == 1 && arr2[i] < index) {
index = arr2[i];
}
}
return index == 10001 ? -1 : index;
}
}

编辑于 2018-08-29 18:04:36 回复(1)
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        char[] chars = str.toCharArray();
        int[] map = new int[256];
        for (int i = 0; i < chars.length; i++) {
            map[chars[i]]++;
        }
        for (int i = 0; i < chars.length; i++) {
            if (map[chars[i]] == 1) return i;
        }
        return -1;
    }
}

发表于 2017-07-26 11:08:37 回复(8)
Java  28ms  9M  代码呈上:
int[] a = new int[58];
        for(int i=0; i<str.length(); i++) {
            a[str.charAt(i) - 'A'] += 1;
        }
        for(int j=0; j<str.length(); j++) {
            if(a[str.charAt(j) - 'A'] == 1) {
                return j;
            }
        }
return -1;
发表于 2019-03-04 14:48:35 回复(1)
//感觉自己的代码比较清晰
class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        int i;
        if(str.length()<1) return -1;
        for(i=0;i<str.length();i++){
            int position1=str.find(str[i]);
            int position2=str.rfind(str[i]);
            if(position1!=position2) continue;
            else break;
        }
       return i;
    }
};

发表于 2017-08-26 22:21:41 回复(2)
import java.util.HashMap;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();

        
        for (int i = 0; i < str.length(); i++) {

            if (!hashMap.containsKey(str.charAt(i))) {
                hashMap.put(str.charAt(i), 1);
            } else {
                hashMap.put(str.charAt(i), hashMap.get(str.charAt(i)) + 1);
            }

        }
        
        for (int i = 0; i < str.length(); i++) {
            if(hashMap.get(str.charAt(i))==1){
                return i;
            }
            
        }
        return -1;
    }
}


发表于 2015-05-09 00:06:59 回复(0)
function FirstNotRepeatingChar(str)
{
    for(let i = 0 ;i < str.length; i++){
        if(str.indexOf(str[i]) === str.lastIndexOf(str[i])){
            return i;
        }
    }
    return -1;
}

发表于 2021-10-01 15:50:50 回复(1)
    public int FirstNotRepeatingChar(String str) {
        for (int i = 0; i < str.length(); i++) {
            // 第一次出现的位置和最后一次出现的位置一样
            while (str.indexOf(str.charAt(i)) == str.lastIndexOf(str.charAt(i))) {
                return i;
            }
        }
        return -1;
    }

发表于 2021-09-15 14:53:11 回复(1)
C++
class Solution {
public:
	int FirstNotRepeatingChar(string str) {
		int size = str.size();
		if (size<1 || size>10000)
			return -1;
		set<char> s1;
		set<char> s2;
		for (int i = 0; i < size; i++)
		{
			if (!s1.insert(str[i]).second)
				s2.insert(str[i]);
		}
		if (s1.empty())
			return -1;
		for (int j = 0; j < size; j++)
		{
			if (s2.insert(str[j]).second)
				return j;
		}
		return -1;
	}
};

发表于 2019-08-07 00:02:18 回复(0)

bitmap法求解,空间最优

一共有256个字符,每个字符用2位来记录它当前出现的次数,00表示没有出现,01表示出现1次,10表示出现两次以上,所以bitmap的大小应该为256*2=512 bit,一个int是四个字节,32bit,所以需要大小为16的int数组就可以存储所有的表示

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        int* bitmap = new int[16]();
        int arr_idx, bit_idx;
        for(int i = 0; i < str.length(); ++i){
            arr_idx = str[i] * 2 / 32;
            bit_idx = str[i] * 2 % 32;
            if(((bitmap[arr_idx] >> bit_idx) & 1) == 0){
                bitmap[arr_idx] |= (1 << bit_idx);
            }else if(((bitmap[arr_idx] >> (bit_idx+1)) & 1) == 0){
                bitmap[arr_idx] |= (1 << (bit_idx+1));
            }
        }
        for(int i = 0; i < str.length(); ++i){
            arr_idx = str[i] * 2 / 32;
            bit_idx = str[i] * 2 % 32;
            if(((bitmap[arr_idx] >> bit_idx) & 1) == 1 && ((bitmap[arr_idx] >> (bit_idx+1)) & 1) == 0){
                return i;
            }
        }
        return -1;
    }
};
发表于 2019-04-12 23:40:55 回复(0)


/*解题思路:
  这个方法可能有点笨哈,请大神批评指正><:
    从第一个字符开始和每一个字符相比较,当遇到和自己相同并且不是同一个位置时,
直接跳出内循环,从下一个字符开始和每一个比较,一旦出现不同的的时判断是否到了
字符串的末尾,不是的话继续比较,否则的话,返回外循环的值
(此时外循环的值正是第一个不重复字符).
 */
 class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        int len = str.length();
        if(len == 0)
            return -1;
        for(int i = 0;i < len;i++){
            for(int j = 0;j < len;j++){
                if(str[i] == str[j] && i != j){
                    break;
                }
                if(i != j && str[i] != str[j]){
                    if(j == len -1 )
                        return i;
                    else
                        continue;
                }
            }
        }
        return -1;
    }
};

编辑于 2017-08-27 11:34:16 回复(4)
import java.util.ArrayList;
/**
*用ArrayList存储字符数组,每次删除字符数组中一种字符
*若删除后字符数组长度-1,则证明该字符只出现一次
*/
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if(str.equals(""))
            return -1;
        for(int j = 0;j < str.length();j++){
            ArrayList<Character> list = new ArrayList<Character>();
            for(int i = 0;i < str.length();i++){
		 list.add(str.charAt(i));
	    }
	    for(int i = 0,len = list.size();i < len;i++ ){
		if(list.get(i) == str.charAt(j)){
		list.remove(i);
		 --len;
	         --i;
		}
	     }
	    if(str.length() - list.size() == 1)
		return j;
	}
	return 0;
    }
}

编辑于 2017-07-27 16:49:50 回复(0)
public class Solution_35 {
    public int FirstNotRepeatingChar(String str) {
    	if(str.equals("")) return -1;
    	int[][] map = new int[58][2];
    	
    	for (int i = 0; i < str.length(); i++) {
			char c = str.charAt(i);
			int pos = c - 'A';
			if(map[pos][0] == 0){
				map[pos][1] = i;
			}
			map[pos][0]++;
		}
    	
    	int ret = Integer.MAX_VALUE;
    	for (int i = 0; i < 58; i++) {
			if(map[i][0] == 1){
				ret = Math.min(ret, map[i][1]);
			}
		}
    	
        return ret;
    }
}


发表于 2017-05-29 18:41:22 回复(0)
class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        int len=str.length();//也可以用size();
        if(len<1||len>10000) return -1;
        int hashmap[256]={0},i;
        for(i=0;i<len;i++){
            hashmap[str[i]]++;
        }
        for(i=0;i<len;i++){
            if(hashmap[str[i]]==1) return i;
        }
        return -1;
    }
};

发表于 2017-03-18 17:33:37 回复(1)

class Solution {
public:
int FirstNotRepeatingChar(string str) {
if(str.empty())
return -1;
int array[256]={0};
for(int i=0;i<str.size();i++)
array[str[i]]++;
int result=-1;
for(int i=0;i<str.size();i++){
if(array[str[i]]==1){
result = i;
break;
}
}
return result;
}
};
编辑于 2016-08-06 10:47:26 回复(0)