1.最长公共前缀
思路:纵向比较,每个字符串从头挨个比较
class Solution {public String longestCommonPrefix(String[] strs) {StringBuilder sb = new StringBuilder();for(int i = 0;i<strs[0].length();i++){char c = strs[0].charAt(i);for(int j = 1;j<strs.length;j++){if(i >= strs[j].length()|| strs[j].charAt(i)!= c) {return sb.toString();}}sb.append(c);}return sb.toString();}
}
2.压缩字符串
思路:使用StringBuilder
class Solution {public int compress(char[] chars) {if(chars.length == 1){return 1;}int count = 1;StringBuilder sb = new StringBuilder();for(int i = 0;i<chars.length;i++){if(i == chars.length - 1){sb.append(chars[i]);if(count>1){sb.append(count);}break;}if(chars[i] != chars[i+1]){sb.append(chars[i]);if(count>1){sb.append(count);}count = 0;}count++;}char[] cs = new String(sb).toCharArray();int i = 0;for(char c : cs){chars[i] = c;i++;}return sb.length();}
}
双指针
class Solution {public int compress(char[] chars) {if(chars.length == 1){return 1;}int slow = 0;int fast = 0;for(int i = 0;i<chars.length;i++){if(i == chars.length - 1 || chars[i] != chars[i + 1]) {chars[fast++] = chars[i];int num = i - slow + 1;if (num > 1) {int anchor = fast;while (num > 0) {chars[fast++] = (char)(num % 10 + '0');num /= 10;}reverse(chars, anchor,fast - 1);}slow = i + 1;}}return fast;}public void reverse(char[] chars, int left, int right) {while (left < right) {char temp = chars[left];chars[left] = chars[right];chars[right] = temp;left++;right--;}}}
3.表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个
'e'
或'E'
,后面跟着一个 整数 - 若干空格
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 下述格式之一:
- 至少一位数字,后面跟着一个点
'.'
- 至少一位数字,后面跟着一个点
'.'
,后面再跟着至少一位数字 - 一个点
'.'
,后面跟着至少一位数字
- 至少一位数字,后面跟着一个点
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
class Solution {public boolean isNumber(String s) {if(s == null||s.length() == 0){return false;}char[] str = s.trim().toCharArray();if(str.length == 0){return false;}boolean isDot = false;boolean isE = false;boolean isSign = false;boolean isNum = false;int i = 0;// System.out.print(str.length);for(i = 0;i<str.length;i++){if(str[i]>='0'&&str[i]<='9'){isNum = true;}else if(str[i] == '.'){if(isDot || isE){return false;}isDot = true;isE = false;}else if(str[i] == 'e'||str[i] == 'E'){if(isE || !isNum){return false;}isE = true;isNum = false;isSign = false;}else if(str[i] == '+'||str[i] == '-'){if(i!= 0 && str[i-1] != 'e' && str[i-1] != 'E'){return false;}isSign = true;}else{return false;}}return isNum;}
}