1.最长公共前缀
思路:纵向比较,每个字符串从头挨个比较
java
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
java
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();
}
}
双指针
java
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"]
java
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;
}
}