转载请注明出处: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】第一个字符只出现一次的更多相关文章

  1. 《剑指offer》数组中只出现一次的数字

    本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ...

  2. 【剑指Offer】数组中只出现一次的数字 解题报告(Python)

    [剑指Offer]数组中只出现一次的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  3. 【剑指offer】删除字符也出现在一个字符串

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除 ...

  4. 【Java】 剑指offer(56-1) 数组中只出现一次的两个数字

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程 ...

  5. Go语言实现:【剑指offer】数组中只出现一次的数字

    该题目来源于牛客网<剑指offer>专题. 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 正常能想到哈希表来处理,但此题考查的是异或的知识, ...

  6. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  7. 剑指Offer——第一个只出现一次的字符位置

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置. 分析: 用一个数组统计每个字符出现的次数. 再次扫描数组,如果找到 ...

  8. 用js刷剑指offer(第一个只出现一次的字符)

    题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 牛客网链接 js代码 fu ...

  9. 剑指offer 第一个只出现一次的字符 hash

    思路:i表示字符的ASCII码值,cntp[i]表示字符出现的次数. AC代码 class Solution { public: int FirstNotRepeatingChar(string st ...

  10. 剑指offer系列60---第一个只出现一次的字符

    [题目]在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置. * 若为空串,返回-1.位置索引从0开始 * [思路]1 首先遍历字符串数组,添 ...

随机推荐

  1. struts2对action中的方法进行输入校验(2)

    struts2输入校验流程: 1.类型转换器对请求參数运行类型转换,并把转换后的值赋给aciton中的属性 2.假设在运行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext, ...

  2. HDU 3488Tour(流的最小费用网络流)

    职务地址:hdu3488 这题跟上题基本差点儿相同啊... . 详情请戳这里. 另外我认为有要改变下代码风格了..最终知道了为什么大牛们的代码的变量名都命名的那么长..我决定还是把源点与汇点改成sou ...

  3. [置顶] 一步一步学android之事件篇——下拉列表事件

    上一篇RadioGroup比较简单,所以再学习个spinner的OnItemSelectedListener事件,前面说过spinner的主要功能就是提供列表显示的选择,比如我们在选择城市的时候就会用 ...

  4. html5css3杂记

    最新版本号的safari.chrome.firefox以及opera支持某些html5特性.ie9将支持某些html5特性. html5提供了展现视频的标准<video>支持ogg及mpe ...

  5. _00021 尼娜抹微笑伊拉克_谁的的最离奇的异常第二阶段 Jedis pool.returnResource(jedis)

    笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 博文标题:_00021 妳那伊抹微笑_谁的异常最诡异第二期之 Jedis pool.returnRes ...

  6. HDU 3830 Checkers

    意甲冠军: 有三件  所有其他棋子可以跳  不能分开的两个跳跃  当被问及状态u为了国家v最低短跳转 思路: 对于一个状态三个棋子的位置能够设为 x y z  (小到大) 仅仅有当y-x=z-y的时候 ...

  7. python学习1(小白记录)

    python创建cocos2d-x项目注意点1. 2.7.5版本号的.配置好环境变量之后.要切换到tools文件夹下.直接运行 python create_project.py ..........这 ...

  8. 如何通过shell脚本操作MongoDB

    通过shell脚本对MongoDB进行自动化操作 运行写好的 ./show.sh 脚本 发现能够建立mongo链接 #!/bin/sh mongo WordPress --eval "sho ...

  9. ECshop 表结构

    -- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...

  10. 两个div在同一行,两个div不换行

    方法一: <div style="display:inline"> <div id="div1" style="float:left ...