剑指Offer面试题35:第一个只出现一次的字符
来源:互联网 发布:java api安卓版 编辑:程序博客网 时间:2024/06/04 19:31
题目:第一个只出现一次的字符
在字符中找出第一个只出现一次的字符。如输入“abaccdeff”则,输出b.
算法分析:
算法1.最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某个字符时拿这个字符和后面的每个字符相比较,如果后面没有发现重复字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思想的时间复杂度为O(n*n)。
算法2.由于题目由于题目与字符出现的次数有关,我们是不是可疑统计每个字符在该字符串中出现的次数,要达到这个目的,我们需要一个数据容器来存放每个字符出现的次数。在这个容器中可以根据字符来查找它出现的次数,也就是说这个容器的作用就是把一个字符映射称一个数字。在常用的数据容器中,哈希表正是这个用途。
为了解决这个问题,我们可以定义哈希表的键值(key)是字符,而值(Value)是该字符出现的次数。同时我们还需要从头开始扫描字符串两次。第一次扫描字符串时,每扫描到一个字符就在哈希表中的对应项中把次数加1.接下来第二次扫描时,每扫描到一个字符就能从哈希表中得到该字符出现的次数。这样第一个只出现一次的字符就是符合要求的输出。
算法源程序:
/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 号:v1.0 * 题目描述:剑指Offer面试题35:第一个只出现一次的字符* 在数组中的两个数如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求这个数组中逆序对的总数。* *例如在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(6,4)、(5,4)。* 输入描述:请输入一个字符串(不包含空格):*abccdebaf* 程序输出: 第一个只出现一次的字符是:d* 问题分析: * 算法描述:* 完成日期:2016-09-22***************************************************************/package org.marsguo.offerproject35;import java.util.HashMap;import java.util.Scanner;class SolutionMethod1{HashMap<Character,Integer> map = new HashMap<>();public char FirstFunction(String str){//将此函数改为public int FirstFunction(String str){则可返回该字符所在位置if(str == null)return '0';int length = str.length();char[] charArray = str.toCharArray();//用于输出第一个不重复字符/*for(int k = 0;k < charArray.length; k ++){System.out.print(charArray[k] + ",");}*/for(int i = 0; i < length; i++){//for循环用于循环判断字符出现次数/*boolean containKey(Object key)函数:如果此映射包含指定键的映射关系,则返回true.当且仅当此映射包含针对满足 (key==null ? k==null : key.equals(k)) 的键 k 的映射关系时,返回 true*/if(map.containsKey(str.charAt(i))){int value = map.get(str.charAt(i));map.remove(str.charAt(i));map.put(str.charAt(i),value + 1);}else{map.put(str.charAt(i), 1);}}for(int i = 0; i < length; i++){if(map.get(str.charAt(i))==1)//得到值为1对应的字符//return i;//return i返回字符所在位置return charArray[i];//因为是return,所以当找到第一个只出现1次的字符后就返回,后面就不找了}return '0';}}public class FirstNotRepeatingChar {public static void main(String[] args){Scanner scanner = new Scanner(System.in);System.out.println("请输入一个字符串(不包含空格):");String str = scanner.nextLine();System.out.println("第一个只出现一次的字符是:");scanner.close();SolutionMethod1 solution1 = new SolutionMethod1();System.out.println(solution1.FirstFunction(str));}}
程序运行结果:
0 0
- 剑指offer面试题35第一个只出现一次的字符,用hash
- 剑指Offer:面试题35 第一个只出现一次的字符
- 剑指offer 面试题35—第一个只出现一次的字符
- 《剑指Offer》学习笔记--面试题35:第一个只出现一次的字符
- 【剑指Offer学习】【面试题35:第一个只出现一次的字符】
- 剑指Offer面试题35(java版):第一个只出现一次的字符
- [剑指Offer]面试题35:第一个只出现一次的字符
- 剑指 offer代码解析——面试题35第一个只出现一次的字符
- 剑指offer-面试题35:第一个只出现一次的字符
- 剑指Offer----面试题35:第一个只出现一次的字符
- 剑指Offer面试题35:第一个只出现一次的字符
- 剑指offer--面试题35:第一个只出现一次的字符位置
- 剑指Offer面试题35(java版):第一个只出现一次的字符
- 剑指Offer之面试题35:第一个只出现一次的字符
- 剑指Offer---面试题35:第一个只出现一次的字符
- 【剑指offer】面试题35-第一个只出现一次的字符
- 剑指offer-面试题35-第一个只出现一次的字符
- 剑指Offer系列-面试题35:第一个只出现一次的字符
- mp4v2录制音视频同步方法
- Oracle、SQL Server、MySQL分页方法
- 弹出网页窗口全攻略(html/hta)
- 不使用composer安装yii高级版本的方法
- spark源码阅读笔记Dataset(三)structField、structType、schame
- 剑指Offer面试题35:第一个只出现一次的字符
- 初识C#线程
- portable python是个好东西
- 萌梦聊天室16.9.23.77更新
- DELPHI产生不重复随机数的简便算法
- BufferedWriter
- Exercise(25):Cantor表
- 设计模式之-建造者模式
- swift3新路程(6)参数的标签、自定义标签和"_"