LeetCode 第 69 场力扣双周赛

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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_56884023/article/details/122388655