题目如下:

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

先上代码:

 class Solution {
public:
int FirstNotRepeatingChar(string str) {
//冷静的思考这个个题目,明显我们需要完整的遍历完整个字符串才可以
int length = str.size();
if(length == )
return -;
vector<int>cnt(,);//初始化所有字母的统计为0;
for(int i = ;i < length;i++)
{
if(str[i] <= )
cnt[str[i]-]++;
else
cnt[str[i]--]++;
}
for(int i = ;i <length;i++)
{
if(str[i] <= )
{
if(cnt[str[i]-] == )
return i;
}
else
{
if(cnt[str[i]--] == )
return i;
}
}
return -;
}
};

这个问题的思路是什么?

我知道很多人要说一看就是hash,抱歉说实话,我之前学习过hash,但现在还不知道怎么用。但是并不妨碍我做这一道题!

首先,题目说找到第一个只出现一次的字符,这说明了什么?

试想?如果你不遍历完整个字符串,你知道第一个只出现一次的字符是什么吗?答案是无法知道的。这也就断了你用其他高超技巧的念头,也就是说如果你不遍历完,那么你根本无法得知。

因此,我们需要做的首先就是遍历完所有的字符。

题目中说了只有大写和小写字母,那么我们可以申请一个最小为26*2的空间大小的数组(上文已经说了你跟本不知道有哪些字符要出现,所以你必须至少申请这么多!)

然后我们要做什么?

当然事统计每个字符出现的频数。

我们的想法很简单,让A-Z对应vector的索引0-25,让a-z对应索引26-51。也就是对应索引位置的值为该字符出现的次数,比如cnt[0]表示字符A出现的次数。

也就是下面这段代码:

  for(int i = ;i < length;i++)
{
if(str[i] <= )
cnt[str[i]-]++;
else
cnt[str[i]--]++;
}

当我们统计完之后,就应该查找了,说实话,我做完了这一步并不知道怎么找第一个,并一度认为这样的做法无法找出第一个出现一次的字符。为何我会这么认为呢?这里描述一下我开始的思维过程:

比如 f和a都出现了一次,但是f先出现,a后出现,所以正确的结果中应该返回f的位置。但是我当时想:这个统计数组是按照字母表排序的,如果我按照数组cnt查找第一个,那么第一个cnt==1的必然是a,那么我当然会去原字符串中去找a所在的位置。那么此时返回的结果并不是第一次只出现一次的字符,而是只出现一次的字符在字母表中的第一个。这个结果当然是错误的。究其原因,是因为我们试图以数组cnt作为索引。去遍历cnt。

但是实际上呢?我们可以不这么做,我们应该以原字符串为索引。也就是以原字符串的字符为key,而已cnt的值为value。这样才能得到正确的结果:

 for(int i = ;i <length;i++)
{
if(str[i] <= )
{
if(cnt[str[i]-] == )
return i;
}
else
{
if(cnt[str[i]--] == )
return i;
}
}

我们可以看到第五行和第十行的代码,明显是以字符为索引,以cnt为value,这样便得到了正确的结果。

倘若我们以cnt为key,str为value。显然是得不到正确结论的

牛客网剑指offer第34题——找到第一个只出现一次的字符的更多相关文章

  1. 牛客网剑指offer第13题——调整数组顺序使得奇数位于偶数前面

    题目来源:剑指offer 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变 ...

  2. 牛客网剑指offer第19题——顺时针打印矩阵

    这个题看似很简单: 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...

  3. 牛客网剑指offer第21题——判断出栈序列是否是入栈序列

    题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

  4. 数组中只出现过一次的数字 牛客网 剑指Offer

    数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...

  5. 数组中出现次数超过一半的数字 牛客网 剑指Offer

    数组中出现次数超过一半的数字 牛客网 剑指Offer 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字 ...

  6. 数据流中的中位数 牛客网 剑指Offer

    数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...

  7. 数字在排序数组中出现的次数 牛客网 剑指Offer

    数字在排序数组中出现的次数 牛客网 剑指Offer 题目描述 统计一个数字在排序数组中出现的次数. class Solution: def GetNumberOfK(self, data, k): i ...

  8. 数值的整数次方 牛客网 剑指Offer

    数值的整数次方 牛客网 剑指Offer 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方 class Solution: #run ...

  9. 按之字形顺序打印二叉树 牛客网 剑指Offer

    按之字形顺序打印二叉树 牛客网 剑指Offer 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 ...

随机推荐

  1. IP命令介绍

    ip指令可以显示或操作路由.网络设备.设置路由策略和通道 1.语法 ip [选项]  Object  COMMAND [help] Object对象可以是: link  网络设备.addr 设备的协议 ...

  2. pycharm打印出的汉字显示乱码

    pycharm未配置时,默认配置为: 打印汉字时显示乱码 简单设置即可 这下以后就没有问题了.

  3. BGP2

    1) 按照拓扑搭建网络,在所有AS间使用直连接口建立EBGP邻居关系: 2) 在公司总部AS400中,R4与R5,R5与R7,R7与R6,R6与R4间使用环回接口建立IBGP邻居关系,IGP协议使用O ...

  4. redHat更新yum源

    1. 网易镜像仓库查找相关rpm 包并下载 :http://mirrors.163.com/centos/6/os/x86_64/Packages/ wget http://mirrors.163.c ...

  5. Java设计模-过滤器模式

    过滤器模式 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接 ...

  6. 四、RabbitMQ Exchange类型

    RabbitMQ整体上是一个生产者与消费者模型,主要负责接收.存储和转发消息.可以把消息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上,RabbitMQ就好 ...

  7. CentOS-Samba服务安装与配置

    title date tags layout CentOS6.5 Samba服务安装与配置 2018-09-03 Centos6.5服务器搭建 post 例题: 在服务器中安装Samba服务,创建共享 ...

  8. 听《Sara》

    Sara这首歌太好听了,虽然没有清楚具体是唱什么,但我感觉是讲一个故事,很好奇,我找到了歌词. Sara 塞拉 鲍勃迪伦 I laid on a dune, I looked at the sky, ...

  9. Node.js知识点详解(一)基础部分

    转自:http://segmentfault.com/a/1190000000728401 模块 Node.js 提供了exports 和 require 两个对象,其中 exports 是模块公开的 ...

  10. JavaScript学习总结(五)原型和原型链详解

    转自:http://segmentfault.com/a/1190000000662547 私有变量和函数 在函数内部定义的变量和函数,如果不对外提供接口,外部是无法访问到的,也就是该函数的私有的变量 ...