Leetcode 第 69 场双周赛记录

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kaze-1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值