1.. 第一个只出现一次的字符
class Solution { public int firstUniqChar(String s) { int []count =new int[125]; for(int i=0;i<s.length();i++){ char ch=s.charAt(i); count[ch]++; } for(int i=0;i<s.length();i++) { char ch = s.charAt(i); if (count[ch] == 1) { return i; } } return -1; } }
假设是这样一组字符串,返回第一个只出现一次的字符,那就是b,我们可以这样做
1.创建一个大的数组,用来记录每个字母出现的次数
2.再次遍历字符串,返回计数数组是1的字母的下标;
但是这样浪费的空间比较多,所以采取-97的做法,正好对应0,1,2,3等这样的位置
class Solution { public int firstUniqChar(String s) { int []count =new int[125]; for(int i=0;i<s.length();i++){ char ch=s.charAt(i); count[ch-97]++; } for(int i=0;i<s.length();i++) { char ch = s.charAt(i); if (count[ch-97] == 1) { return i; } } return -1; } }
2.求最后一个单词的长度
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextLine()) { // 注意 while 处理多个 case String str=in.nextLine(); int index=str.lastIndexOf(" "); String ret=str.substring(index+1); int l=ret.length(); System.out.println(l); } } }
这道题就用了String的库函数
3.判断是否为回文串
class Solution { public boolean isPalindrome(String s) { s.toLowerCase(); int left=0; int right=s.length()-1; while(left<right){ while(left<right&&!isValidChar(s.charAt(left))){ left++; } while(left<right&&!isValidChar(s.charAt(right))){ right--; } if(s.charAt(left)!=s.charAt(right)){ return false; }else{ left++; right--; } } return true; } private boolean isValidChar(char ch){ if(Character.isDigit(ch)||Character.isLetter(ch)){ return true; } return false; } }
这个题面试中常考,回文串就是正着写和倒着写是一样的,方法是这样的
先将所有字母变成小写,再看看是否符合数字或者字母,符合得话,左边往后走,右边往前走
然后判断左边和右边的是否相等,如果不相等,就返回FALSE,如果相等,就继续走
在判断字符是否合法时,可以使用char的包装类的方法进行判断