文档章节

【九度OJ1283】|【剑指offer35】第一个只出现一次的字符

aqia358
 aqia358
发布于 2013/10/17 11:33
字数 747
阅读 42
收藏 1

题目描述:

在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符。

输入:

输入有多组数据
每一组输入一个字符串。

输出:

输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1

方法1:

看到这个题目,最直观的想法就是就是遍历法,也就是从头开始取字符串中的一个字符,将其与其后的所有字符比较,如果有相同的字符,那么就证明它不是 只出现一次的字符。当第一次出现遍历完其后字符并且没有重复时,表明这个字符就是“第一个只出现一次的字符”。如果字符串有n个字符,每个字符可能与后面 的O(n)个字符相比较,因此这种思路的时间复杂度是O(n2)。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void findOne(String s){
		for(int i = 0; i < s.length(); i++){
			boolean flag = false;
			for(int j = 0; j < s.length(); j++){
				if(s.charAt(i) == s.charAt(j) && i != j)
					flag = true;
			}
			if(!flag){
				System.out.println(1);
				return;
			}
		}
		System.out.println(-1);
			
	}
	public static void main(String[] args) {
//		findOne("ABA");
//		findOne("AA");
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		while(true){
			try {
				String s = br.readLine();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

方法2:

题目中要求第一个只出现一次的字符,那么就跟字符出现的次数有关。我们考虑如何统计字符出现的次数,然后找出第一个次数为1的那个字符。这里我们需要一个数据容器来保存字符出现次数,并且能够通过字符找出其相对应的次数。哈希表就是一种常用用的容器。

我们可以定义哈希表的键值(Key)是字符的ASCII值,而值(Value)是该字符出现的次数。同时我们需要扫描两次字符串,第一次扫描字符串 时,每扫描到一个字符就在哈希表的对应项中把次数加1。接下来第二次扫描的时候,没扫描到一个字符就能在哈希表中得到该字符出现的次数。找出第一个 Value为1的那个key就是我们需要找到那个字符。

哈希1:

import java.util.Scanner;

public class Copy_2_of_Main {

	public static void findOne(String s) {
		int[]a = new int[256];
		for (int i = 0; i < s.length(); i++) {
			int b = s.charAt(i);
			if(a[b] == 1)
				a[b] = 2;
			else
				a[b] = 1;
		}
		for(int j = 0; j < s.length(); j++){
			if(a[s.charAt(j)] == 1){
				System.out.println(j);
				return;
			}
		}
		System.out.println(-1);
	}

	public static void main(String[] args) {
//		findOne("AA");
//		findOne("ABACCDEFF");
		Scanner s = new Scanner(System.in);
		while (true) {
			String str = s.next();
			findOne(str);
		}
	}
}
哈希2
import java.util.Scanner;

public class Main {

	public static void findOne(String s) {
		int[] a = new int[26];
		int lenght = s.length();
		for (int i = 0; i < lenght; i++) {
			a[s.charAt(i) - 'A']++;
		}
		for (int j = 0; j < lenght; j++) {
			if (a[s.charAt(j) - 'A'] == 1) {
				System.out.println(j);
				return;
			}
		}
		System.out.println(-1);
	}

	public static void main(String[] args) {
//		 findOne("AA");
//		 findOne("ABACCDEFF");
		Scanner s = new Scanner(System.in);
		while (s.hasNext()) {
			String str = s.next();
			findOne(str);
		}
	}
}

© 著作权归作者所有

共有 人打赏支持
aqia358
粉丝 6
博文 82
码字总数 30297
作品 0
海淀
程序员
经典算法学习——第一个只出现一次的字符

这同样是剑指Offer中的很经典的一道面试题。题目描述为:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'. 一开始大家就会想到最简单的方法就是每访问到一个字符的时...

chenyufeng1991
2016/08/21
0
0
[剑指offer] 字符流中第一个不重复的字符

本文首发于我的个人博客:尾尾部落 题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符...

繁著
07/29
0
0
python剑指offer66题

二维数组的查找 替换空格 从头到尾打印链表 重建二叉树 用两个栈实现队列 选择数组中的最小数字 斐波那契数列 跳台阶 变态跳台阶 矩形覆盖 二进制中1的个数 数值的整数次方 调整数组顺序使奇...

lyy0905
06/03
0
0
剑指Offer-29-字符串的排列

题目 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 注意:字符可能重复! 比如,a...

SpecialYang
07/23
0
0
去哪儿笔试题2015 - 研发

有序数列二分查找 最简单,最纯粹的二分查找问题,应该是用循环的方法去做的话会得分较高。 2. 寻找第一个出现两次的字符 举个例子:字符串“qywyer23tdd”中第一个出现了两次的字符串是'y'...

NineRec
2014/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
0
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
2
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部