[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,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ... 
随机推荐
- Android 学习之 开源项目PullToRefresh的使用
			首先 下载 Android-PullToRefresh-master 下载地址 https://github.com/chrisbanes/Android-PullToRefresh 下载之后将其解 ... 
- 圣何塞与 Microsoft 宣布该市为超过 5,000 名市府公务员选择 Office 365、Windows Azure 和 StorSimple
			过去几个月来我们展示了极大的客户吸引力,今天我们非常高兴地宣布,我们又赢得了一位新客户,且他们利用 Microsoft 革新 IT 的方式非常有趣. 今天,我们非常高兴地告诉大家,圣何塞市选择了 Mi ... 
- Android切换页面效果的实现一:WebView+ViewFlipper
			前言: 这两周在帮学校做一个新生入学用的“新里程”的项目,要做到页面切换阅读的效果,自己百度了下,找到普遍是使用WebView+ViewFlipper的实现方法,但这种方法不能满足我的要求,因为它很难 ... 
- poj2013---二维数组指针使用
			#include <stdio.h> #include <stdlib.h> #include<string.h> int main() { ; ][],arr2[ ... 
- append与after
			apend与apendTo就如同after与insertAfter,表达意思相同,表达不同.A.after(B)=B.insertAfter(A).apend在元素里面添加,after在元素外面添加. ... 
- background-size:的认识;
			background-size:100%;其实是元素的背景图片的宽度和元素宽度相同,高度auto: 也可理解为:background-size:100% auto; 而background:cover ... 
- mysql 5.6密码强度插件使用
			在mysql 5.6对密码的强度进行了加强,推出了validate_password 插件.支持密码的强度要求. 此插件要求版本:5.6.6 以上版本安装方式: 1.安装插件:(默认安装了插件后,强度 ... 
- AlarmManager类的应用
			1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ... 
- 弹出窗口a标签写下载,再弹出窗口
			如果这个窗口是弹出出口,直接<a href="">点击下载<a>是不行的,得用js这样写,弹出并关闭,不然会回到首页,如果没有定义首页会报错,<a h ... 
- Css 使div标签下沉到页面最低部
			.footer{ position:fixed; bottom:0; } 使用这两个标签就能达到效果 
