【剑指offer】第一个字符只出现一次
转载请注明出处:http://blog.csdn.net/ns_code/article/details/27106997
- 题目描写叙述:
-
在一个字符串(1<=字符串长度<=10000,所有由大写字母组成)中找到第一个仅仅出现一次的字符。
- 输入:
-
输入有多组数据
每一组输入一个字符串。
- 输出:
-
输出第一个仅仅出现一次的字符下标。没有仅仅出现一次的字符则输出-1。
- 例子输入:
-
ABACCDEFF
AA
- 例子输出:
-
1
-1
处理字符串中反复或者次数出现等问题,最经常使用的就是哈希表,用字符串中的字符作为key。字符出现次数作为value,假定仅仅有ASCII码范围内的字符,则能够开辟一个256大小的int数组,将每一个字符(key)映射到该数组的相应位置上。计算每次出现的次数就可以。遍历一次字符串,计算每一个字符出现的次数。保存在int数组的相应位置上,第二次遍历字符串。若第一次出现某个字符对相应到的哈希表的相应位置处的元素为1。则该字符便是第一个仅仅出现一次的字符,假设我们是遍历哈希表(int数组)。则找到的哈希表中的第一个元素为1的位置相应的字符为字符串中第一个最小的仅仅出现一次的字符。
时间复杂度为O(n)。须要额外的256个int空间来辅助,能够看做空间复杂度为O(1)。
另外,假设要省空间,我们能够bitmap算法。用两个位来表示相应字符出现的次数,出现0次。则为00,出现一次则为01。出现2次及以上,都维持在10就可以。
另外,有一点须要注意。char的范围在-128-127,unsigned char的范围才是在0-255,因此ASCII值在128-255之间的字符。假设保存为了char型,其转化为int值的范围是在-128--1之间,这点在以下的代码中有体现。
以下给出用简单哈希表AC的代码(依据题目要求和測试要求分别写了两个函数):
#include<stdio.h>
#include<string.h> /*
返回第一个出现一次的字符
*/
char FirstOnceChar(char *str)
{
if(str == NULL)
return '\0'; int hashtable[256];
memset(hashtable,0,sizeof(hashtable));
char *pCur = str;
while(*pCur != '\0')
{
if(*pCur>=0)
hashtable[*(pCur++)]++;
else
hashtable[*(pCur++)+256]++;
} while(*str != '\0')
{
int index;
if(*str>=0)
index = *str;
else
index = *str+256; if(hashtable[index] == 1)
return *str;
else
str++;
}
return '\0';
} /*
返回第一个出现一次的字符的下标
*/
int IndexOfFirstOnceChar(char *str)
{
if(str == NULL)
return -1; int len = strlen(str);
int hashtable[256];
memset(hashtable,0,sizeof(hashtable));
int i;
for(i=0;i<len;i++)
{
if(str[i]>=0)
hashtable[str[i]]++;
else
hashtable[str[i]+256]++;
} for(i=0;i<len;i++)
{
int index;
if(str[i]>=0)
index = str[i];
else
index = str[i]+256; if(hashtable[index] == 1)
return i;
}
return -1;
} int main()
{
char str[10010];
while(gets(str) != NULL)
printf("%d\n",IndexOfFirstOnceChar(str));
return 0;
}
/**************************************************************
Problem: 1283
User: mmc_maodun
Language: C
Result: Accepted
Time:10 ms
Memory:912 kb
****************************************************************/
版权声明:本文博客原创文章。博客,未经同意,不得转载。
【剑指offer】第一个字符只出现一次的更多相关文章
- 《剑指offer》数组中只出现一次的数字
本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ...
- 【剑指Offer】数组中只出现一次的数字 解题报告(Python)
[剑指Offer]数组中只出现一次的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- 【剑指offer】删除字符也出现在一个字符串
转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除 ...
- 【Java】 剑指offer(56-1) 数组中只出现一次的两个数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程 ...
- Go语言实现:【剑指offer】数组中只出现一次的数字
该题目来源于牛客网<剑指offer>专题. 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 正常能想到哈希表来处理,但此题考查的是异或的知识, ...
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
- 剑指Offer——第一个只出现一次的字符位置
题目描述: 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置. 分析: 用一个数组统计每个字符出现的次数. 再次扫描数组,如果找到 ...
- 用js刷剑指offer(第一个只出现一次的字符)
题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 牛客网链接 js代码 fu ...
- 剑指offer 第一个只出现一次的字符 hash
思路:i表示字符的ASCII码值,cntp[i]表示字符出现的次数. AC代码 class Solution { public: int FirstNotRepeatingChar(string st ...
- 剑指offer系列60---第一个只出现一次的字符
[题目]在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置. * 若为空串,返回-1.位置索引从0开始 * [思路]1 首先遍历字符串数组,添 ...
随机推荐
- mongodb在PHP下的应用学习笔记
1.连接 mongodb默认端口是:27017,因此我们连接mongodb:$mongodb = new Mongo('localhost') 或者指定IP与端口 $mongodb = new Mon ...
- UVA 11100 The Trip, 2007 贪心(输出比较奇葩)
题意:给出n个包的大小,规定一个大包能装一个小包,问最少能装成几个包. 只要排序,然后取连续出现次数最多的数的那个次数.输出注意需要等距输出. 代码: /* * Author: illuz <i ...
- 使用Intent启动组件
android应用程序的三大组件--Activities.Services.Broadcast Receiver,通过消息触发,这个消息就是Intent,中文又翻译为"意图"(我感 ...
- python六核心编程——条件和循环
1.if声明 单 if 通过使用布尔运算符的声明 and , or 和 not. if-elif-else. elif即else if if expression1: expr1_true_ ...
- Hadoop云计算大数据书籍分享
1. 推荐书名 大数据云计算利器: Hadoop, The Definitive Guide, 1Ed.pdf(第1版) 大数据云计算利器: Hadoop, The Definitive ...
- poj3468(线段树)
题目连接:http://poj.org/problem?id=3468 线段树功能:update:成段增减 query:区间求和. 分析:需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候 ...
- 新西兰gap year_百度百科
新西兰gap year_百度百科 新西兰gap year Working Holiday Visa,即打工度假签证.它允许旅行者出于补贴旅行费用的目的而在签证颁发国边打工边旅行.用来鼓励双方国家 ...
- Flex读取txt文件里的内容(二)
Flex读取txt文件里的内容 自己主动生成的文件 LoadTxt-app.xml: <?xml version="1.0" encoding="utf-8&quo ...
- 利用Nginx构建负载均衡server
大家都知道.一个域名相应一个IP地址,而一个WebSite则相应一个IP地址上相应port服务的应用程序(或位置).而大型站点的并发訪问量很大,这些站点是怎样在一台Webserver上实现负载均衡的呢 ...
- .Net C# Windows Service于server无法启动,错误 193:0xc1
1.情况说明:的近期发展windows维修,当地win7系统正常.把server安装会失败. 图中的引导失败的例子.: 解决方法:执行->输入:eventvwr.msc 打开你的事件查看器 ...