C++版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)
面试题35:第一个只出现一次的字符
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。(2006年google的一道笔试题。)
分析:
首先应向确认一下是ASCII字符串,而不是Unicode字符串。用hash表求解即可,由于需要先遍历一次,时间复杂度为O(n),空间复杂度为O(1) (256个ASCII字符).
满足题意的代码如下:
#include<cstdio>
#include<string>
#include<unordered_map>
using namespace std;
class Solution {
public:
char FirstNotRepeatingChar(string str) {
if(str.size() == 0) return '\0';
unordered_map<char, int> countMap; // 使用C++中的map的insert时,返回结果是自动按key排序(增序)后的结果
for(int i = 0;i < str.size();i++){
if(countMap.find(str[i]) == countMap.end())
countMap[str[i]]=1;
// countMap.insert({str[i], 1}); // 映射表中没找到相关记录,加到映射表,次数设置为1
else countMap[str[i]]++; // 映射表中找到了相关记录,将映射表中的次数+1
}
// int pos = -1;
char ch;
for(int i = 0;i < str.size();i++){
if(countMap[str[i]] == 1){
// pos = i;
ch=str[i];
break;
}
}
return ch;
}
};
// 以下为测试
int main()
{
Solution sol;
string str1="abaccdeff";
string str2="cbacnba";
char res1 = sol.FirstNotRepeatingChar(str1);
char res2 = sol.FirstNotRepeatingChar(str2);
printf("%c\n", res1);
printf("%c\n", res2);
return 0;
}
也可简化为:
#include<cstdio>
#include<string>
#include<unordered_map>
using namespace std;
class Solution {
public:
char FirstNotRepeatingChar(string str) {
int hash[256] = {0};
for(auto c : str){ // 遍历一次,复杂度为O(n)
hash[c] ++;
}
char ch;
for(int i=0;i<str.size();i++){
if(hash[str[i]] == 1){
//return i;
return str[i];
}
}
return '\0'; // if(str.size() == 0) return '\0';
}
};
// 以下为测试
int main()
{
Solution sol;
string str1="ABACCDEFF";
string str2="cbacnba";
char res1 = sol.FirstNotRepeatingChar(str1);
char res2 = sol.FirstNotRepeatingChar(str2);
printf("%c\n", res1);
printf("%c\n", res2);
return 0;
}
相比而言,前一种方法更高效,256个字符可能只出现很少的一部分,后面这种方法在空间上消耗多一点...
九度OJ 提交网址 http://ac.jobdu.com/problem.php?pid=1283
牛客网OJ 改编: 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。位置索引从0开始。
提交网址: http://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&tqId=11187
- 输入:
-
一个字符串。
- 输出:
-
输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1。
- 样例输入:
- ABACCDEFF
AA
- 样例输出:
- 1
-1 - 牛客网 AC代码:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
if(str.size() == 0) return -1;
unordered_map<char, int> countMap; // 使用C++中的map的insert时,返回结果是自动按key排序(增序)后的结果
for(int i = 0;i < str.size();i++){
if(countMap.find(str[i]) == countMap.end())
countMap[str[i]]=1; // 映射表中没找到相关记录,加到映射表,次数设置为1
else countMap[str[i]]++; // 映射表中找到了相关记录,将映射表中的次数+1
}
int pos = -1;
for(int i = 0;i < str.size();i++){
if(countMap[str[i]] == 1){
pos = i;
break;
}
}
return pos;
}
};
精简之后:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int hash[256] = {0};
for(auto c : str){ // 遍历一次,复杂度为O(n)
hash[c] ++;
}
for(int i=0;i<str.size();i++){
if(hash[str[i]] == 1){
return i;
}
}
return -1; // if(str.size() == 0) return -1;
}
};
华为OJ034-找出字符串中第一个只出现一次的字符
题目描述
找出字符串中第一个只出现一次的字符
接口说明
原型:
char FindChar(InputString);
输入参数:字符串InputString
输出参数:
如果无此字符 请输出该字符;如果无此字符,请输出'.'。
输入描述
输入一串字符
输出描述
输出一个字符
输入例子
asdfasdfo
输出例子
o
AC代码(C++风格):
#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;
char FirstNotRepeatingChar(string str)
{
if(str.size() == 0) return '.';
unordered_map<char, int> countMap;
for(int i = 0;i < str.size();i++){
if(countMap.find(str[i]) == countMap.end())
countMap[str[i]]=1;
else countMap[str[i]]++; // 映射表中找到了相关记录,将映射表中的次数+1
}
char ch;
for(int i = 0;i < str.size();i++){
if(countMap[str[i]] == 1){
ch=str[i];
break;
}
}
return ch;
}
int main() {
string str;
while(cin>>str) {
char ch=FirstNotRepeatingChar(str);
cout<<ch<<endl;
}
return 0;
}
或
#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;
char FindChar(string str)
{
unordered_map<char,int> m;
char ch;
for(unsigned int i=0; i<str.size(); i++)
m[str[i]]++;
unsigned int i;
for(i=0; i<str.size(); i++) {
if(m[str[i]]==1) {
ch=str[i]; break;
}
}
if(i==str.size()) ch='.';
return ch;
}
int main() {
string str;
while(cin>>str) {
char ch=FindChar(str);
cout<<ch<<endl;
}
return 0;
}
AC代码(使用指针):
#include<iostream>
#include<string>
using namespace std;
char FindChar(char *input)
{
char *p=input;
int hash[256];
for(int i=0;i!=256;i++)
hash[i]=0;
while(*p!='\0')
{
hash[*p]++;
p++;
}
char *p1=input;
while(*p1!='\0')
{
if(hash[*p1]==1)
{
return *p1;
}
p1++;
}
return '.';
}
int main()
{
char str[1000];
while(cin>>str)
{
char ch=FindChar(str);
cout<<ch<<endl;
}
return 0;
}
C++版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)的更多相关文章
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- C++版 - 剑指offer 面试题22:栈的压入、弹出序列 题解
剑指offer 面试题22:栈的压入.弹出序列 提交网址: http://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId ...
- C#版 - 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
面试题9:斐波那契数列及其变形(跳台阶.矩形覆盖) 提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tp ...
- C++版-剑指offer 面试题6:重建二叉树(Leetcode105. Construct Binary Tree from Preorder and Inorder Traversal) 解题报告
剑指offer 重建二叉树 提交网址: http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tq ...
随机推荐
- 页面跳转之session
题意:设主页为index.jsp 通过session将index.jsp中的信息传送给结果页面result.jsp.(其实,session的生命周期是整个服务器开启过程,具体不做详细介绍).这个 其实 ...
- Java中的异步通知
在我们的日常开发中,经常会遇到这样的问题--"我让你做一件事情,但是你做得很慢,并不能够立马返回给我结果,害我一直在那儿等着你给我返回结果,什么都做不了". 程序是自上而下顺序执行 ...
- Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比
1.概论 -- 来自维基的解释 /dev/null : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一 ...
- (转)protein 数据库
最早关注蛋白质互作网络,是在来GDMC第一年的时候,中间停了半年看互作-各种算法,网络分析停滞不前,没想到搞到最后,还是和网络碰到了一起,我总是会潜意识走近给自己第一印象不错的object,包括人.用 ...
- Android进阶推荐书籍
中级进阶推荐看一下以下这几本书 1.<Android从入门到精通(附光盘)> 明日科技 编 2.<第一行代码2 Android(第二版)> 郭霖 著 3.<Android ...
- Java GC相关知识
Java堆的分类 分为两类:YoungGen和OldGen.其中,YoungGen分为三部分:eden,from survivor和to survivor,比例默认是:8:1:1 PermGen不属于 ...
- 1、了解计算机与操作系统发展阶段 2、选择一个具体的操作系统,结合计算机与操作系统的发展阶段,详细了解其渊源、发展过程、趋势,整理成简洁美观的图文博客发布。 Windows Mac os x Unix Linux Android 等。
1.了解计算机与操作系统发展阶段 操作系统并不是与计算机硬件一起诞生的,它是在人们使用计算机的过程中,为了满足两大需求:提高资源利用率.增强计算机系统性能,伴随着计算机技术本身及其应用的日益发展,而逐 ...
- js深度复制三种方法
1.用递归的方式进行深度复制 2.用JSON.stringify加上JSON.parse()进行深度复制 3.用jquery中自带的方法$.extend()进行深度复制 具体实现代码可百度自行查询
- ASP.NET Core Web App应用第三方Bootstrap模板
引言 作为后端开发来说,前端表示玩不转,我们一般会选择套用一些开源的Bootstrap 模板主题来进行前端设计.那如何套用呢?今天就简单创建一个ASP.NET Core Web MVC 模板项目为例, ...
- leetcode-查找和替换模式
一.题目描述 你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配.如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我 ...