Leetcode 第 69 场双周赛记录
1、第一题 5960. 将标题首字母大写
难度:easy
给你一个字符串 title ,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母。请你按以下规则将每个单词的首字母 大写 :
如果单词的长度为 1 或者 2 ,所有字母变成小写。
否则,将单词首字母大写,剩余字母变成小写。
请你返回 大写后 的 title 。
class Solution {
public:
string capitalizeTitle(string title) {
int i,j=0;
vector<string>res;
for (i = 0; i < title.length();i++)//扫描整个字符串
{
string tem_title="";
while (title[j] != ' '&& j < title.length())
{
tem_title += title[j];
j++;
}
if (title[j] == ' ' && j < title.length())j++;
if (tem_title == "")break;//已经扫描完毕
res.push_back(tem_title);// store all the words into a vector "res"
}
for (i = 0; i < res.size(); i++)
{
int len = res[i].length();
if (len == 1 || len == 2)
for (j = 0; j < len; j++)
res[i][j] = tolower(res[i][j]);
else
{
res[i][0] = toupper(res[i][0]);
for (j = 1; j < len; j++)
res[i][j] = tolower(res[i][j]);
}
}
string res_s="";
for (i = 0; i < res.size() - 1; i++)
res_s = res_s + res[i] + ' ';
res_s += res[res.size() - 1];
return res_s;
}
};
解法略长,但是思路很清晰:先从Title中取处每个单词,再逐个单词按照题目要求处理,最后拼成新的Title
要点:1、用string的**+运算便利地完成拼接
2、用string类的tolower/toupper函数**完成字母大小写转换(不用对ASCII码操作,避免分类讨论)
2、第二题 5961.链表最大孪生和
难度:medium
在一个大小为 n 且 n 为 偶数 的链表中,对于 0 <= i <= (n / 2) - 1 的 i ,第 i个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点 。
比方说,n = 4 那么节点 0 是节点 3 的孪生节点,节点 1 是节点 2 的孪生节点。这是长度为 n = 4 的链表中所有的孪生节点。孪生和 定义为一个节点和它孪生节点两者值之和。
给你一个长度为偶数的链表的头节点 head ,请你返回链表的 最大孪生和 。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
int pairSum(ListNode* head) {
ListNode* p = head;
vector<int>front_half,rear_half,sums;
int n = 0,num=0,i;
while (p != nullptr)
{
p = p->next;
n++;//get length of the list
}
p = head;
while (p != nullptr)
{
if (num <= (n / 2) - 1)
front_half.push_back(p->val);
else
rear_half.push_back(p->val);
p = p->next;
num++;
}
reverse(rear_half.begin(),rear_half.end());
for (i = 0; i < front_half.size(); i++)
sums.push_back(front_half[i] + rear_half[i]);
int max = *max_element(sums.begin(), sums.end());
return max;
}
};
这道题虽然难度是medium但是感觉应该是easy,毕竟时间复杂度O(n)下,只需要先遍历一遍得到链表长度,再遍历一遍把前半段和后半段分别保存,再后半段逆置,直接相加取最大值就行了
注意后半段一定要记得逆置,可以用函数reverse(iterator1,iterator2)完成,头文件是#include<algorithm>