剑指offer(二.1)数据结构篇之数组

来源:互联网 发布:免费数据库有哪些 编辑:程序博客网 时间:2024/06/14 05:49

数据结构重点:数组、字符串、链表、树、栈、队列

数组:占据一块连续的内存并按顺序存储数据。

创建数组时,先指定数组大小,再根据大小分配内存。【预先分配内存】

1.数组实现简单哈希表

数组下标设为哈希表的键值key,把数组中的每一个数字设为哈希表的值value,每个下标及数组中该下标对应的数字组成键值-值的配对。实现O(1)的查找。
如P186 面试题35:第一个只出现一次的字符
在字符串中找出第一个只出现一次的字符。如输入:“abaccdeff”,则输出‘b’。
思路:统计每个字符出现在该字符串的次数,用一个数据结构存放每个字符出现的次数,完成字符到数字的映射,可用哈希表。
该题目中只需一个简单的哈希表就可实现。
/** 利用哈希表算法,扫描两次字符串,* 第一次记录相同位置的字符出现的次数,* 第二次找到第一个次数为1的字符并返回。时间复杂度为O(n),空间效率O(1)。*/#include <iostream>#include <string>using namespace std;char FirstNotRepeatingChar(char* pInString){if (pInString == NULL)return 0;//定义并初始化哈希表const int tableSize = 256;int hashTable[tableSize];for (int i = 0; i < tableSize; ++i)hashTable[i] = 0;//第一遍遍历,hash表记录每个字符出现的次数char *pHashKey = pInString;while (*pHashKey != '\0'){hashTable[*pHashKey]++;pHashKey++;}//指针重新指向字符串的第一个字符pHashKey = pInString;//第二遍遍历,返回第一个次数为1的字符while (*pHashKey!='\0'){if (hashTable[*pHashKey] == 1)return *pHashKey;pHashKey++;}//没有只出现一次的字符//cout << ""<<endl;return 0;}int main(int argc, char* argv[]){cout << "请输入测试字符串:" << endl;const int maxSize = 256;char str[maxSize];cin >> str;cout << "第一个只出现一次的字符:";cout << FirstNotRepeatingChar(str) << endl;system("pause");return 0;}
当需要判断多个字符是不是在某个字符串中出现过,或统计多个字符在某个字符串中出现的次数,可以考虑这种方法,基于数组创建简单的哈希表。

2. 相关题目练习

①定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现的所有字符。如“we are happy”和“weppy”,输出“ are ha”

快慢指针的方法,初始化,快慢指针都指向第一个字符。
循环过程:如果快指针指的是不需要删除的字符,将值赋给满指针所指的值后,快指针同时+1,;
   如果快指针指向待删除字符,则直接+1。当快指针指向\0,则终止。
/** 快慢指针从第一个字符串中删除第二个字符串内容* */#include <iostream>  using namespace std;const int Tablesize = 256;void Delete(char * first, char* second){char hashTable[Tablesize];for (int i = 0; i<Tablesize; i++){hashTable[i] = 0;}char* p = second;while (*p){hashTable[*p] = 1;p++;}char* fast = first;char* slow = first;while (*fast){if (hashTable[*fast] == 0){*slow = *fast;slow++;}fast++;}*slow = '\0';}void main(){char first[] = "I LOVE U";char second[] = "IU";Delete(first, second);cout << first << endl;system("pause");}


0 0