Skip to content

Latest commit

 

History

History
94 lines (67 loc) · 2.49 KB

File metadata and controls

94 lines (67 loc) · 2.49 KB

050_01-第一个只出现一次的字符

tags: 哈希表


题目原文

牛客网链接

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

解题思路

暴力法

1563174221203

哈希表计数法

1563174247129

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        if(str.empty())
            return -1;
        unsigned int hashTable[256]={0};
        int i=0;
        for(;i<str.size();i++)
            hashTable[str[i]]++;
        for(i=0;i<str.size();i++){
            if(hashTable[str[i]]==1)
                break;
        }
        return i;
    }
};

关于有符号数和无符号数的转换

关于有符号数和无符号数的转换 - C/C++

char, unsigned char, int,unsigned int之间的相互转换

无符号整数和有符号整数之间进行强制类型转换时,位模式不改变。

有符号数转换为无符号数时,负数转换为大的正数,相当于在原值上加上2的n次方,而正数保持不变。

无符号数转换为有符号数时,对于小的数将保持原值,对于大的数将转换为负数,相当于原值减去2的n次方。

当表达式中存在有符号数和无符号数类型时,所有的操作都自动转换为无符号类型。可见无符号数的运算优先级高于有符号数。

unsigned int a = 20;
signed int b = -130;

运算一下结果是 b>a 。

代码

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        if(str.empty())
            return -1;
        unsigned int hashTable[256]={0};
        int i=0;
        for(;i<str.size();i++)
            hashTable[str[i]]++;
        for(i=0;i<str.size();i++){
            if(hashTable[str[i]]==1)
                break;
        }
        return i;
    }
};

举一反三

1563174463094