《剑指offer》——第一个只出现一次的字符位置

原创 2015年11月17日 22:20:20

T:

题目描述
在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。位置索引从0开始.

这道题目,和以下问题的解决思路类似:

问题:

给定一个字符串,该字符串都是由阿拉伯数字0~9组成,该字符串可能很长(几万,甚至更长),问如何更快的找出所有只出现过一次的数字?

解法相同,而设定场景不同,这就是需要融会贯通的地方。

  • 比较笨的一种解法,那就是用一个两层循环来做,看看当前位置的元素是否在后面也出现过。该解法的时间复杂度为O(n2),当n很大的时候,那是相当的不能忍啊。。。

  • 还一种相对容易一些的方法,就是先遍历一遍,统计各个元素出现的次数,再在统计数据中找出数值为1的元素。

那么问题的关键就是在这个统计结构的设计了,如何设计?也许用一个二维数组,那么,如果元素不是阿拉伯数字,而是字母怎么办?这是相对麻烦的一种,幸好java都已经做了封装,我们可以用hashMap,或者hashSet来解决。

如果用c语言来实现,又该怎么破?没有封装好的哈希来调用,只能寻求其他方法。如果是阿拉伯数字,那么统计结构就可以设计成为一个长度为10的一维整型数组,字符串中出现的阿拉伯数字就可用来代表其在整型数组中的下标,问题迎刃而解,省时省力省空间。如果不是阿拉伯数字,而是字母,那就设定一个长度为26的整型一维数组。

先给出一个hashMap版本的:

code:

    import java.util.HashMap;

    /**
     * T: 第一个只出现一次的字符位置
     * 
     * 题目描述 
     * 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。
     * 若为空串,返回-1。位置索引从0开始.
     * 
     * date: 2015.11.17  21:16
     * @author SSS
     *
     */
    public class Solution {

        /**
         * 设立一个hashMap,将每个字母出现的次数进行统计。
         * 若要找出第一个,就要对string从头开始再次遍历一遍,
         * 找到其在hashMap中的value值为1,则返回其下标
         * @param str
         * @return
         */
        public int FirstNotRepeatingChar(String str) {

            int index = -1;
            if (str == null || str == "") {
                return index;
            }

            HashMap<Character, Integer> statisticsMap = new HashMap<Character, Integer>();

            // 第一次遍历,统计每个字符出现的个数
            for (int i = 0; i < str.length(); i++) {
                Character tempChar = str.charAt(i);
                if (statisticsMap.get(tempChar) == null) {
                    statisticsMap.put(tempChar, 1);
                } else {
                    int tempCount = statisticsMap.get(tempChar) + 1;
                    statisticsMap.remove(tempChar);
                    statisticsMap.put(tempChar, tempCount);
                }
            }

            // 第二次遍历,找出第一个只出现一次的字符的下标位置
            for (int i = 0; i < str.length(); i++) {
                Character tempChar1 = str.charAt(i);
                if (statisticsMap.get(tempChar1) == 1) {
                    index = i;
                    break;
                }
            }

            return index;
        }
    }

再来第二种用数组统计的方式:

code:

    import java.util.HashMap;

    /**
     * T: 第一个只出现一次的字符位置
     * 
     * 题目描述 
     * 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。
     * 若为空串,返回-1。位置索引从0开始.
     * 
     * date: 2015.11.17  21:16
     * @author SSS
     *
     */
    public class Solution {

        /**
         * 另一种方式,用数组进行统计
         * @param str
         * @return
         */
        public int FirstNotRepeatingChar(String str) {
            int index = -1;
            if (str == null || str == "") {
                return index;
            }

            // 创建一个数组进行统计
            int []countArr = new int[26];
            // 初始化
            for (int i = 0; i < countArr.length; i++) {
                countArr[i] = 0;
            }

            // 本题目比较坑的地方,都是大写或者都是小写,先进行判断
            char tempChar = 'a';
            if (str.charAt(0) < tempChar) {
                tempChar = 'A';
            }
            // 进行统计
            for (int i = 0; i < str.length(); i++) {
                int tempIndex = str.charAt(i) - tempChar;
                int nums = countArr[tempIndex];
                countArr[tempIndex] = nums + 1;
            }

            // 在原字符串中找出该字符第一次出现的地方,记录其下标,中断for循环
            for (int i = 0; i < str.length(); i++) {
                if (countArr[str.charAt(i) - tempChar] == 1) {
                    index = i;
                    break;
                }
            }

            return index;
        }
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

剑指Offer面试题35(java版):第一个只出现一次的字符

题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'. 看到这样的题目,我们最直观的想法就是从头开始扫描这个字符串中的字符。当访问某个字符时拿这个字符和后面的每个字...
  • jsqfengbao
  • jsqfengbao
  • 2015年08月09日 16:14
  • 2451

[剑指Offer]面试题35:第一个只出现一次的字符

题目给定一个字符串,求第一个不重复的字符 abbcad -> c解题思路:今天中午面试的时候第二题我的思路是从头开始扫描字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较。如果...
  • CodeEmperor
  • CodeEmperor
  • 2016年03月19日 10:23
  • 1247

剑指offer----第一个只出现一次的字符位置----java实现

在一个字符串(1字符串长度,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。位置索引从0开始。 如果从头开始让每一个字符都与其后面的字符相比较,当第一个出现一次的字符,就结束...
  • snow_7
  • snow_7
  • 2016年07月07日 17:32
  • 960

在字符串中查找第一个只出现一次的字符

在字符串中查找第一个只出现一次的字符。例如输入字符串"abaccdef",输出b,     分析:(1)创建一个数组,并初始化数组,                       (2)遍历字符串,...
  • xulu_258
  • xulu_258
  • 2015年05月26日 20:32
  • 948

第一个只出现一次的字符 java实现

题目描述 在一个字符串(1 分析:由于题目与字符出现的次数相关,我们是不是可以统计每个字符在该字符串中出现的次数,要打到这么目的,我们需要一个数据容器来存储每个字符在字符串中出现的次数,这...
  • qq_23217629
  • qq_23217629
  • 2016年10月09日 13:18
  • 1402

在一个字符串中找到第一个只出现一次的字符。如输入:abcdab,则输出:c。

题目:在一个字符串中找到第一个只出现一次的字符。如输入:abcdab,则输出:c。 分析:看到这道题时,有两种思路: (1)最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时...
  • yanxiaolx
  • yanxiaolx
  • 2016年06月02日 22:47
  • 1665

剑指offer_第一个只出现一次的字符

题目描述在一个字符串(1
  • lingongheng
  • lingongheng
  • 2016年10月05日 09:48
  • 762

在字符串(字母)中找出第一个只出现一次的字母

第一个只出现一次的字符:在字符串中找出第一个只出现一次的字母。函数支持汉字查询,但不知道这个函数在实际应用有什么用。 在编程中发现直接 这样 arr[字符串]是设定对象属性,不是访问数组。var fi...
  • 6rl
  • 6rl
  • 2016年11月01日 15:42
  • 585

【华为OJ】找出字符串中第一个只出现一次的字符

找出字符串中第一个只出现一次的字符 详细描述: 接口说明 原型: bool FindChar(char* pInputString, char* pChar); 输入参数: char* pInputS...
  • haoxiaodao
  • haoxiaodao
  • 2015年04月20日 20:22
  • 706

剑指offer-第一个只出现一次的字符-php

题目 在一个字符串(1
  • acingdreamer
  • acingdreamer
  • 2017年04月10日 19:44
  • 302
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《剑指offer》——第一个只出现一次的字符位置
举报原因:
原因补充:

(最多只允许输入30个字)