[Jobdu] 题目1283:第一个只出现一次的字符
- 题目描述:
-
在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符。
- 输入:
-
输入有多组数据
每一组输入一个字符串。
- 输出:
-
输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1。
- 样例输入:
-
ABACCDEFF
AA
- 样例输出:
-
1
-1
分析:
这道面试题对时间复杂度的要求是O(n)。如果按照普通的遍历数组的方法,时间复杂度为O(n2),那么思考一下如何用O(n)的算法解决此问题。利用HashTable的思想,就可以做到O(n),由于ASCII中有256个字符,为0-255,用一个字节表示。将数组map[256]作为哈希表,数组下标为字符,数组中的值对应字符出现的次数。第一遍扫描字符串,确定每个字符出现的次数。第二遍扫描字符串,确定第一个只出现一次的字符。
总结:这类题目很具有代表性,在字符串处理的问题中,经常采用哈希表的方法来解决问题,因为散列查找是线性查找,所以往往可以得到最佳的时间复杂度O(n),除了寻找字符串中出现特定次数的字符外,删除字符串中重复出现的字符或者指定的字符,这类问题也可以采用哈希表的方法来解决。
代码:
#include <cstdio>
#include <cstring> #define MAXSIZE 10001 int main() {
char str[MAXSIZE];
while (scanf("%s", str) != EOF) {
int map[] = {};
const char *p = str; while (*p != '\0')
map[*p++]++; int i;
for (i = ; i < strlen(str); i++) {
if (map[str[i]] == )
break;
}
if (i != strlen(str)) {
printf("%d\n", i);
} else {
printf("-1\n");
}
} return ;
}
扩展:
1.实现一个函数,给定两个字符串str1和str2,将字符串str1中出现在str2中的字符删除掉,例如str1="Less is more",str2="sor",返回"Le i me"
2.实现一个函数,删除字符串中所有重复出现的字符,例如"google",返回"gole"
char *deleteCharacters(char *p1, char *p2) {
int map[] = {};
while (*p2 != '\0')
map[*p2++]++;
char *newStr = (char *) malloc(sizeof(char) * MAXSIZE);
char *p = newStr;
while (*p1 != '\0') {
if (map[*p1] == ) {
*p++ = *p1++;
} else {
p1++;
}
}
return newStr;
}
还有一个留作练习,自己实现。
[Jobdu] 题目1283:第一个只出现一次的字符的更多相关文章
- 剑指Offer - 九度1283 - 第一个只出现一次的字符
剑指Offer - 九度1283 - 第一个只出现一次的字符2013-11-21 21:13 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出 ...
- 九度OJ 1283 第一个只出现一次的字符
题目地址:http://ac.jobdu.com/problem.php?pid=1283 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现 ...
- 剑指Offer面试题:30.第一个只出现一次的字符
一.题目:第一个只出现一次的字符 题目:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出'b'.要求时间复杂度为O(n). 最直观的想法是从头开始扫描这个 ...
- 【剑指Offer面试编程题】题目1283:第一个只出现一次的字符--九度OJ
题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据 每一组输入一个字符串. 输出: 输出第一个只出现一次的 ...
- 九度oj 题目1283:第一个只出现一次的字符
题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据 每一组输入一个字符串. 输出: 输出第一个只出现一次的 ...
- 九度OJ 1283:第一个只出现一次的字符 (计数)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1808 解决:997 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符 ...
- 【编程题目】在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。
第 17 题(字符串):题目:在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 思路:此题非常容易. 最开始是想开辟一块空间存储每个字符出现的次数. 但转念一想,似乎 ...
- C++版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)
面试题35:第一个只出现一次的字符 题目:在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b.(2006年google的一道笔试题.) 分析: 首先应向确认一下是ASCII字 ...
- 剑指OFFER之第一个只出现一次的字符(九度OJ1283)
题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...
随机推荐
- Spring单例与线程安全小结
一.Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就是只有一个实例.单例模式确 ...
- golang仿AS3写的ByteArray
用golang写了个仿AS3写的ByteArray,稍微有点差别,demo能成功运行,还未进行其他测试 主要参考的是golang自带库里的Buffer,结合了binary 来看看demo: packa ...
- linux 磁盘空间扩容 vg(+pv) lv(+空间) lv(缩减磁盘空间)
preFace APP scenario description: 当你未能合理的规划存储时,在后期的维护工作中可能会涉及的存储的 再规划(eg,某一个 or 数个App 对某一个lv 即挂载点写Bi ...
- 04737_C++程序设计_第5章_特殊函数和成员
例5.1 分析下面程序中析构函数与构造函数的调用顺序. #include<iostream> using namespace std; class object { private: in ...
- MySQL 5.7.10 免安装配置
# 配置环境:windows 64bit # 安装版本:mysql-5.7.10-win32(zip archive版本) 1. ZIP Archive版是免安装的,只需把mysql-5.7.10-w ...
- SQL Convert XML to Table
将xml nodes 属性中的值 转为table 形式 declare @xml2 xml set @xml2 = '<CMADatas> <CMAData CmaName=&quo ...
- asp.net textbox keyup事件触发后台的textchange事件
textbox文本框text_change事件,失去焦点才会执行. 通过keyup事件,js控制失去焦点. <asp:TextBox runat="server" ID=&q ...
- BZOJ 3669: [Noi2014]魔法森林( LCT )
排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...
- ROS使用rqt_console
打开一个新的终端在里面输入: sudo apt-get install ros-hydro-rqt ros-hydro-rqt-common-plugins ros-hydro-turtlesim 安 ...
- linux杂记(十四)CAJ文档阅读方法
关于Linux下看CAJ文档的方法 前言:由于大四狗要写各种各样的综述,看各种论文,关于知网为何没有PDF下载,关于为何知网没有CAJ阅读器for linux的种种蛋疼问题,都不要问我. 说回正题,网 ...