剑指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
原创粉丝点击