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 "不存在";
}
}