第一次只出现一次的字符

来源:互联网 发布:甘肃启航网络待遇 编辑:程序博客网 时间:2024/06/09 02:25

//在字符串中找出第一个只出现一次的字符。如输"abaccdeff",则输出'b'.#include "string"#include "map"#include "iostream"using namespace std;//法1:用map O(nlogn)char firstNotRepeatedChar0(char* str){if (str == NULL)  //一定要有,strlen(str)位置读取冲突return '\0';int len = strlen(str);map<char, int> charCount;for (int i = 0; i < len; i++)charCount[str[i]]++;for (int i = 0; i < len; i++){if (charCount[str[i]] == 1){cout << str[i] << endl;return str[i];}}return '\0';}#include "unordered_map"char firstNotRepeatedChar1(char* str){if (str == NULL)  //一定要有,strlen(str)位置读取冲突return '\0';int len = strlen(str);unordered_map<char, int> charCount;for (int i = 0; i < len; i++)charCount[str[i]]++;for (int i = 0; i < len; i++){if (charCount[str[i]] == 1){cout << str[i] << endl;return str[i];}}return '\0';}//自己用哈希表,如果是ascii编码的话256个字符char firstNotRepeatedChar2(char* str){if (str == NULL)return '\0';int len = strlen(str);const int tableSize = 256;unsigned int hashTable[tableSize] = { 0 };for (int i = 0; i < len; i++)hashTable[str[i]]++;for (int i = 0; i < len; i++){if (hashTable[str[i]] == 1){cout << str[i] << endl;return str[i];}}return '\0';}#include "ctime"void test(){char* str = "abaccdeff";clock_t t0 = 0, t00;clock_t t1 = 0, t11;clock_t t2 = 0, t22;for (int i = 0; i < 1000; i++){t00 = clock();firstNotRepeatedChar0(str);t0 += clock() - t00;t11 = clock();firstNotRepeatedChar1(str);t1 += clock() - t11;t22 = clock();firstNotRepeatedChar2(str);t2 += clock() - t22;}cout << t0 << "ms" << endl;cout << t1 << "ms" << endl;cout << t2 << "ms" << endl;}int main(){test();return 0;}
运行结果:

201ms
214ms
85ms

自己写的hashTable最快,自带的unordered_map最慢。虽然unordered_map内部机理也是hashtable,但较于直接的hastTbale[size],做了很多超出本题需要的无用功。所以会慢。


0 0