/**************************************************************************
题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'。
**************************************************************************/
/*
解题思路:
我们可以定义哈希表的键值(Key)是字符,而值(value)是该字符出现的次数。同时
我们还需要从头开始扫描字符串两次。第一次扫描字符串时,每扫描到一个字符就在哈希
表的对应项中把次数加1。接下来第二次扫描时,每扫描到一个字符就能从哈希表中得到
字符出现的次数。这样第一个只出现一次的字符就是符合要求的输出。
*/
#include<stdio.h>
char firstNoRepeaChar(char* str)
{
if(str == NULL)
return '\0';
const int tableSize = 256;
unsigned int hashTable[tableSize];
for(unsigned int i=0; i<tableSize; ++i)
hashTable[i] = 0;
char* pHashKey = str;
while( *pHashKey != '\0')
hashTable[*pHashKey++]++;
pHashKey = str;
while(*pHashKey != '\0')
{
if(hashTable[*pHashKey] == 1)
return *pHashKey;
++pHashKey;
}
return '\0';
}
void test()
{
char* str = "abaccdeff";
printf("%c\n",firstNoRepeaChar(str));
}
int main()
{
test();
return 0;
}
举一反三:
如果需要判断多个字符是不是在某个字符串里出现过或者统计多个字符在某个字符串中
出现的次数,我们可以考虑基于数组创建一个简单的哈希表。这样可以用很小的空间消
耗换来时间效率的提升。
扩展题:
在前面的例子中,我们子所以可以把哈希表的大小设为256,是因为字符时8个bit的类型,
总共只有256个字符。但实际上字符不只是256个,比如中文就有几千个汉子。如果题目要
求考虑汉字,前面的算法是不是有问题?如果有,可以怎么解决?
相关题目:
1.定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现过的所
有字符。例如从第一个字符串"We are students."中删除第二个字符串"aeiou"中出现过
的字符得到的结果是"W r Stdnts."。
解决思路:
我们可以创建一个用数组实现的简单哈希表来存储第二个字符,这样我们从头到尾扫描
第一个字符串中的每一个字符时,用O(1)时间就能判断出该字符是不是在第二个字符中。
如果第一个字符串的长度是n,那么总的时间复杂度是O(N).
2.定义一个函数,删除字符串中所有重复出现的字符。例如输入"google",删除重复的字
符后的结果是"gole"。
解决思路:
这个题目和上面的问题比较类似,我们可以创建一个用布尔数组实现的简单的哈希表。
数组中的元素的意义是其下标看做ASCII码后对应的字母在字符串中是否已经出现。我
们先把数组中所有的元素都设为false。以"google"为例,当扫描到第一个g时,g的ASCII
码是103,那么我们把数组中下标为103的元素设为true。当扫描到第二个g时,我们发现
数组中下标为103的元素的值为true,就知道g在前面已经出现过了。也就是说,我们用
O(1)时间就能判断出每个字符是否在前面已经出现过。如果字符串的长度是n,那么总的
时间复杂度是O(n)。
3.在英语中,如果两个单词中出现的字母相同,并且每个字母出现的次数也相同,那么
则两个单词互为变位词。例如silent与listen、evil与live等互为变位词。请完成一个
函数,判断输入的两个字符串是不是互为变位词。
解决思路:
我们可以创建一个用数组实现的简单哈希表,用来统计字符串中每个字符出现的次数。当
扫描到第一个字符串中的每个字符时,为哈希表对应的项的值增加1.接下来扫描第二个字
符串,扫描到每个字符时,为哈希表对应的项的值减去1。如果扫描完第二个字符串后,
哈希表中所有的值都是0,那么这两个字符串就互为变位词。
==参考剑指offer
分享到:
相关推荐
pre_o_1csdn63m9a1bs0e1rr51niuu33e.a
matlab建立计算力学课程的笔记和文件.zip
FT_Prog_v3.12.38.643--FTD USB 工作模式设定及eprom读写
matlab基于RRT和人工势场法混合算法的路径规划.zip
matlab基于matlab的两步定位软件定义接收机的开源GNSS直接位置估计插件模块.zip
office 2016三和一精简版
文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
麦肯锡咨询顾问必备宝典-时间管理.ppt
文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
麦肯锡顾问的黄金思考方法.pptx
91fdd461elb59a4ce8dfcfc46bc283a7.msi
ansys maxwell
5-5
xx广告促销计划流程实施手册.ppt
仿小米商城微信小程序源码+项目说明.zip
文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
麦肯锡xx客户满意服务.ppt
网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面.zip
【作品名称】:基于python+Scrapy的农业数据爬虫设计与实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于Scrapy的农业数据爬虫设计与实现 . ├── Crops # web服务 │ ├── app.py │ ├── static # 静态文件 │ │ ├── css │ │ └── js │ └── templates # 静态页面 │ ├── corn.html │ ├── corns.html │ ├── index.html │ ├── porcor.html │ ├── pork.html │ └── porks.html ├── README.md └── spider # 爬虫及数据处理 ├── integration # 数据汇总 │ └── corn.py └── tutorial # 爬虫 ├── scrap