剑指offer(二.1)数据结构篇之数组
2016-06-30 21:21
197 查看
数据结构重点:数组、字符串、链表、树、栈、队列
数组:占据一块连续的内存并按顺序存储数据。
创建数组时,先指定数组大小,再根据大小分配内存。【预先分配内存】
如P186 面试题35:第一个只出现一次的字符
在字符串中找出第一个只出现一次的字符。如输入:“abaccdeff”,则输出‘b’。
思路:统计每个字符出现在该字符串的次数,用一个数据结构存放每个字符出现的次数,完成字符到数字的映射,可用哈希表。
该题目中只需一个简单的哈希表就可实现。
循环过程:如果快指针指的是不需要删除的字符,将值赋给满指针所指的值后,快指针同时+1,;
如果快指针指向待删除字符,则直接+1。当快指针指向\0,则终止。
数组:占据一块连续的内存并按顺序存储数据。
创建数组时,先指定数组大小,再根据大小分配内存。【预先分配内存】
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"); }
相关文章推荐
- 一个关于if else容易迷惑的问题
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 一道sql面试题附答案
- C# 超高面试题收集整理
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例