2024.3.11
- 题目来源
- 我的题解
- 方法一 模拟
- 方法二 官方优化版本
题目来源
力扣每日一题;题序:2129
我的题解
方法一 模拟
直接模拟变化就可以了
时间复杂度:O(n)。n表示字符的数量
空间复杂度:O(m)。m表示单词的数量
public String capitalizeTitle(String title) {String[] str=title.split(" ");for(int i=0;i<str.length;i++){String s=str[i];if(s.length()<3){s=lower(s);}else{StringBuilder sb=new StringBuilder();sb.append(upper(s.substring(0,1)));sb.append(lower(s.substring(1)));s=sb.toString();}str[i]=s;}StringBuilder sb=new StringBuilder();for(int i=0;i<str.length;i++){sb.append(str[i]);if(i!=str.length-1)sb.append(" ");}return sb.toString();
}
public String upper(String s){StringBuilder sb=new StringBuilder();for(char c:s.toCharArray()){if(c>='A'&&c<='Z')sb.append(c);elsesb.append((char)(c-'a'+'A'));}return sb.toString();
}
public String lower(String s){StringBuilder sb=new StringBuilder();for(char c:s.toCharArray()){if(c>='a'&&c<='z')sb.append(c);elsesb.append((char)(c-'A'+'a'));}return sb.toString();
}
方法二 官方优化版本
顺序遍历 title 字符串,对于其中每个以空格为分界的单词,我们首先找出它的起始与末尾下标,判断它的长度以进行相应操作:
- 如果长度小于等于 2,则将该单词全部转化为小写;
- 如果长度大于 2,则将该单词首字母转化为大写,其余字母转化为小写。
最终,将转化后的字符串返回作为答案。
时间复杂度:O(n)
空间复杂度:O(1)
public String capitalizeTitle(String title) {StringBuilder sb = new StringBuilder(title);int n = title.length();int l = 0, r = 0; // 单词左右边界(左闭右开)while (r < n) {while (r < n && sb.charAt(r) != ' ') {++r;}// 对于每个单词按要求处理if (r - l > 2) {sb.setCharAt(l, Character.toUpperCase(sb.charAt(l)));++l;}while (l < r) {sb.setCharAt(l, Character.toLowerCase(sb.charAt(l)));++l;}l = r + 1;++r;}return sb.toString();
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~