lt- 165. 比较版本号
[案例需求]
[思路分析一, 采用了api]
- 用
.
分割字符串, 把两个字符串中每个点中间的字符直接转换为数字进行比较即可.
[代码实现]
//采用了api
class Solution {
public int compareVersion(String version1, String version2) {
//split
String[] v1 = version1.split("\\.");
String[] v2 = version2.split("\\.");
for(int i = 0; i < Math.max(v1.length, v2.length); i++){
int v1Number = i >= v1.length ? 0 : Integer.valueOf(v1[i]);
int v2Number = i >= v2.length ? 0 : Integer.valueOf(v2[i]);
if(v1Number > v2Number){
return 1;
}else if(v1Number < v2Number){
return -1;
}
}
return 0;
}
}
- 时空复杂度分析:
- 时间复杂度:O(n+m)(或 O(max(n,m)),这是等价的),其中 n 是字符串version1 的长度,m 是字符串version2 的长度。
- 空间复杂度:O(n+m),我们需要 O(n+m) 的空间存储分割后的修订号列表。
- 如果不使用split分割
.
的话, 我们可以直接把他跳过去; - 采用双指针法同时遍历两个字符串
[代码示例]
class Solution {
public int compareVersion(String version1, String version2) {
//循环取出v1和v2的char 字符进行比较
// 把 . 跳过去
int v1Length = version1.length();
int v2Length = version2.length();
int i = 0, j = 0;
//你可能会问: i, j 不等长怎么办
// 每一次循环之前我们都把存储v1, v2的两个变量置为零
// 等遍历到发现不为0时再改过来不就行了
while(i < v1Length || j < v2Length){
int x = 0; // v1的数
//取出v1的数
while(i < v1Length && version1.charAt(i) != '.'){
x = x* 10 + version1.charAt(i) - '0';
++i;
}
++i;
int y = 0;
//取出v2的数
while(j < v2Length && version2.charAt(j) != '.'){
y = y * 10 + version2.charAt(j) - '0';
++j;
}
++j;
//比较
if(x > y){
return 1;
}else if(x < y){
return -1;
}
}
return 0;
}
}
- 时空复杂度:
- 时间复杂度:O(n+m),其中 n 是字符串 version1 的长度,mm 是字符串 version2 的长度。
- 空间复杂度:O(1),我们只需要常数的空间保存若干变量。
lt -125. 验证回文串
[案例需求]
[思路分析一, api战士]
- 根据题目, 只有数字和大小写字母才能用来比较回文串. 所以需要采用api或者自写判断来过滤从string中遍历的字符;
//1. 使用Character的判断方法: isDigitOrLetter()
char ch = str.charAt(i);
Character.isDigitOrLetter();
//2. 自写判断条件
char ch = str.charAt(i);
public void isDigitOrLetter(){
return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= 0 && ch <=9));
}
//字符串
str.toLowerCase();
str.toUpperCase();
//字符
// 本来java中char是基本数据类型, 所以大小写操作都放在了char的包装类中实现的
Character.toLowerCase(ch);
Character.toUpperCase(ch);
[代码实现]
class Solution {
public boolean isPalindrome(String s) {
//筛选. 比较
StringBuilder sb = new StringBuilder();
int len = s.length();
for(int i = 0; i < len; i++){
char ch = s.charAt(i);
if(Character.isLetterOrDigit(ch)){
sb.append(Character.toLowerCase(ch));
}
}
StringBuilder sb1 = new StringBuilder(sb).reverse();
return sb.toString().equals(sb1 .toString());
}
}
[思路分析二, 双指针]
[代码示例]
class Solution {
public boolean isPalindrome(String s) {
int n = s.length();
int left = 0, right = n - 1;
while (left < right) {
while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
++left;
}
while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
--right;
}
if (left < right) {
if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
return false;
}
++left;
--right;
}
}
return true;
}
}