5960. 将标题首字母大写
添加链接描述
给你一个字符串 title ,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母。请你按以下规则将每个单词的首字母 大写 :
- 如果单词的长度为 1 或者 2 ,所有字母变成小写。
- 否则,将单词首字母大写,剩余字母变成小写。
请你返回 大写后 的 title 。
示例 1:
输入:title = “capiTalIze tHe titLe”
输出:“Capitalize The Title”
解释:
由于所有单词的长度都至少为 3 ,将每个单词首字母大写,剩余字母变为小写。
提示:
1 <= title.length <= 100
title 由单个空格隔开的单词组成,且不含有任何前导或后缀空格。
每个单词由大写和小写英文字母组成,且都是 非空 的。
将字符串以空格分开成数组
遍历此数组
- 字符串长度小于等于2,转小写
- 大于2,字符串转小写,将首字母大写
可以用字符数组,或先拼接大写首字符再拼接余下的字符串- 结尾少一次空格
class Solution {
public String capitalizeTitle(String title) {
String[] ret = title.split(" ");
StringBuilder sb = new StringBuilder();
for(int i = 0; i < ret.length; i++) {
if(ret[i].length() <= 2) {
ret[i] = ret[i].toLowerCase();
}else {
String str = ret[i].toLowerCase(); // 全转小写
// 字符数组 首字母大写
char[] ch = str.toCharArray();
ch[0] = Character.toUpperCase(ch[0]);
ret[i] = new String(ch);
}
sb.append(ret[i]);
if(i < ret.length - 1) { // 空格
sb.append(" ");
}
}
return sb.toString();
}
}
class Solution {
public String capitalizeTitle(String title) {
String[] ret = title.split(" ");
StringBuilder sb = new StringBuilder();
for(int i = 0; i < ret.length; i++) {
if(ret[i].length() <= 2) {
ret[i] = ret[i].toLowerCase();
sb.append(ret[i]);
}else {
sb.append(Character.toUpperCase(ret[i].charAt(0)));
sb.append(ret[i].substring(1).toLowerCase());
}
if(i < ret.length - 1) {
sb.append(" ");
}
}
return sb.toString();
}
}
5961. 链表最大孪生和
添加链接描述
在一个大小为 n 且 n 为 偶数 的链表中,对于 0 <= i <= (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点 。
比方说,n = 4 那么节点 0 是节点 3 的孪生节点,节点 1 是节点 2 的孪生节点。这是长度为 n = 4 的链表中所有的孪生节点。
孪生和 定义为一个节点和它孪生节点两者值之和。
给你一个长度为偶数的链表的头节点 head ,请你返回链表的 最大孪生和 。
示例 1:
输入:head = [5,4,2,1]
输出:6
解释:
节点 0 和节点 1 分别是节点 3 和 2 的孪生节点。孪生和都为 6 。
链表中没有其他孪生节点。
所以,链表的最大孪生和是 6 。
1、取val值 用List计算
class Solution {
public int pairSum(ListNode head) {
if(head == null) {
return 0;
}
List<Integer> list = new ArrayList<>();
ListNode cur = head;
// 将 val 加入 list
while(cur != null) {
list.add(cur.val);
cur = cur.next;
}
// 遍历一半
int max = 0;
for(int i = 0; i < list.size() / 2; i++) {
max = Math.max(max, list.get(i) + list.get(list.size() - 1 - i));
}
return max;
}
}
2、快慢指针反转链表
class Solution {
public int pairSum(ListNode head) {
if(head == null) {
return 0;
}
// 找中间节点
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
// 反转
ListNode cur = slow.next;
while(cur != null) {
ListNode curNext = cur.next;
cur.next = slow;
slow = cur;
cur = curNext;
}
// 求最大和
int maxSum = 0;
while(head != slow) {
maxSum = Math.max(maxSum, head.val + slow.val);
if(head.next == slow) { // 偶数个
break;
}
head = head.next;
slow = slow.next;
}
return maxSum;
}
}
2131. 连接两字母单词得到的最长回文串
添加链接描述
给你一个字符串数组 words 。words 中每个元素都是一个包含 两个 小写英文字母的单词。
请你从 words 中选择一些元素并按 任意顺序 连接它们,并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。
请你返回你能得到的最长回文串的 长度 。如果没办法得到任何一个回文串,请你返回 0 。
回文串 指的是从前往后和从后往前读一样的字符串。
示例 1:
输入:words = [“lc”,“cl”,“gg”]
输出:6
解释:一个最长的回文串为 “lc” + “gg” + “cl” = “lcggcl” ,长度为 6 。
“clgglc” 是另一个可以得到的最长回文串。
class Solution {
public static int longestPalindrome(String[] words) {
HashMap<String, Integer> map = new HashMap<>();
for(String str : words) { // 统计单词次数
map.put(str, map.getOrDefault(str, 0) + 1);
}
int ans = 0; // 最长回文串长度
boolean mid = false; // 是否含有中心单词
for(String str : map.keySet()) {
StringBuilder sb = new StringBuilder(str).reverse(); // 反转
String rev = sb.toString();
// 1、两个字符相同的单词 成对选择该单词
if (str.charAt(0) == str.charAt(1)) {
if(map.get(str) % 2 != 0) { // 中心单词
mid = true;
}
ans += map.get(str) / 2 * 4;
} else if(map.containsKey(rev)) { // 2、两个字符不同的单词 成对选择反转单词
int cnt = Math.min(map.get(str), map.get(rev));
ans += cnt * 4;
map.put(str, map.get(str) - cnt);
map.put(rev, map.get(rev) - cnt);
}
}
if(mid) {
ans += 2;
}
return ans;
}
}