剑指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
- 剑指offer(二.1)数据结构篇之数组
- 剑指offer之java篇之旋转数组(二)
- 剑指offer(二.2)数据结构之数组2 面试题3
- 剑指OFFER之数组篇
- 剑指offer之数据结构
- 剑指offer之数组
- 剑指offer(二十六)之数组中重复的数字
- 剑指offer(二十九)之构建乘积数组
- 剑指offer 2.3 数据结构1-数组求sizeof()
- 二.学习数据结构之数组
- 数组与指针(剑指offer数据结构部分)
- 剑指offer之数组操作
- 剑指offer之数组划分
- 《剑指offer》之数组专题
- 剑指offer 查找二位数组
- 数据结构之数组篇
- 数据结构实验之数组二:稀疏矩阵
- 数据结构之数组结构(二)
- JAX-RS入门 十一:HATEOAS
- glib-2.14升级
- [九度OJ]1042Coincidence
- In android studio,cannot load 2 facets-unknown facet type:android and android-gradle
- ios中修改状态栏颜色的方法
- 剑指offer(二.1)数据结构篇之数组
- Merge Intervals And Insert Interval -- Leetcode
- chrome Vimium plugin
- perl lwp 默认的请求头
- Eclipse无法以Debug模式运行
- JAX-RS入门 十二: 可伸缩的JAX-RS应用
- BZOJ 3122: [Sdoi2013]随机数生成器 ex_gcd+BSGS
- MySQL执行计划
- 解析xml文件的四种方式