转载请注明出处: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. 智能生活 “视”不可挡——首届TCL杯HTML5智能电视开发大赛等你来挑战

    http://www.csdn.net/article/2014-06-04/2820063-TCL-Smart-TV-Innovation-Competation

  2. xcode6 iOS sdk8.1隐藏系统状态栏

    在代码项目(uzplayer)从iOS6升级到iOS8之后,头发如今视频播放器有.系统状态栏后面的背景: 这样就会导致有的时候按下Donebutton,或者拖滑块没有效果 所以,我们须要想个办法.把这 ...

  3. 西南民大oj(矩阵快速幂)

    我的名字不可能那么难记 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 16            测试通过 : ...

  4. spring 定义自己的标签 学习

    自己的自定义配置文件spring 在,有时你想要做一些配置信息的数据结构.基于扩展生意做. 首先: 在项目META-INF文件夹中创建两个文件spring.handlers,和spring.shcem ...

  5. hdu1828(线段树——矩形周长并)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1828 分析:与面积不同的地方是还要记录竖的边有几个(num记录),并且当边界重合的时候需要合并(用lb ...

  6. 【SSH 基础】浅谈Hibernate关系映射(4)

    继上篇博客 多对多关联映射(单向) 多对多对象关系映射,须要增加一张新表完毕基本映射. Hibernate会自己主动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多 ...

  7. Android在如何建立一个WebServer

    今天老板交待任务最终完成了,感觉收获颇多,所以写一个关于它的记录,首先,看一下.老板的需求 需求: 希望移动端的用户标识(IMEI)和HTML页面的用户标识(Cookie)连接起来,当中HTML页面可 ...

  8. 游戏开发实验室的内部讲座总结----c++

     第三节  动态内存分配new和delete 经过调试设置断点,发现new 函数事实上还是调用的malloc函数. 第四节  引用 一个变量是能够有多个引用的,引用也是能够传递的.  常量是不能有 ...

  9. Andriod开发之浏览器开发(WebView)

    1.创建一个WebView在XML文件 <WebView android:id="@+id/webView" android:layout_width="match ...

  10. 辛星解读为什么PHP须要模板

    近期有个人问我:为什么PHP须要模板呢?整个站点的编写都是我一个人完毕的,从前端到后端,都是这样,我一个人写站点是不是就不须要模板了呢?我当时还真给问住了,也没想好非常合适的回答它的方式,于是就随便说 ...