算法--06谷歌面试:字符串中第一个只出现一次的字符(Java实现)

时间:2021-11-01 13:11:19

Q题目

这道题是2006 年 google 的一道笔试题,如下:

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

A解法

这道题,说难也不难,关键是思路。

有些人思考该题时很容易陷入死胡同,想先获取字符串str中所有字符出现的次数,在去根据出现的次数去取值。

抑或

先判断第一个字符出现的次数,判断是否符合条件,不符合,在判断第二个,以此类推。

最优解 - - 逻辑

方式一:存在法

我们可以利用字符串的特点进行判断,因为str有contains()方法,所以我们可以将当前获取的字符从字符串中去除掉,再调用contains()判断该字符是否依然还有。

备注:字符串没有直接剔除特定字符串的方法,所以只能用截取,有点麻烦

方式二:下标法

我们利用字符串的indexOf() 和 lastIndexOf()方法。

获取字符letter在字符串string中从前往后第一次出现的下标--indexOf
获取字符letter在字符串string中从后往前第一次出现的下标-- lastIndexOf
若两个下标相同,说明该字符只出现了一次

代码实现

其他思路虽然可以做出来,但过于复杂,这里就不做演示了。只用最简单的方法了。代码如下:

使用方式二:下标法

package 谷歌第一个出现一次的字母;

/** * 题目:在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。 * 分析:这道题是2006 年 google 的一道笔试题。 * @author Administrator * */
public class Test1 {
    public static void main(String[] args) {
        //测试
        String test="abaccdebff";
        String result=getFirstStr(test);
        System.out.println(result);
    }

    public static String getFirstStr(String str){
        for(int i=0;i<str.length();i++){
            char letter=str.charAt(i);
            //方式一:从str中移除当前字母letter--剩余的字符串str,调用contains()方法,判断是否还存在letter

            //方式二:判断letter在str中从前往后和从后往前找,该字母的下标,若相同说明只有一个letter--indexOf() 和lastIndexOf()
            int start=str.indexOf(letter);
            int end=str.lastIndexOf(letter);
            if(start==end){
                //说明该字符只出现一次
                return String.valueOf(letter);//不能直接返回char类型--因为当letter不存在时返回值不好处理
            }

        }
        return "不存在";
    }
}