8-21力扣双周晚间周赛题(前两题)解析

第一题,特殊打字机键入单词的最少时间

题目链接:https://leetcode-cn.com/problems/minimum-time-to-type-word-using-special-typewriter/
见图片
在这里插入图片描述
例子:
在这里插入图片描述

题目的大意就是给你一个字符串,然后用题目的机制来键入这个字符串。

思路解析:结合示例,我们可以知道:
(1)键入字符本身是需要时间的,所需时间刚好是字符串的长度。
(2)如何计算转动指针的时间?
先考虑第一个,由于指针是一开始指向 ‘a’ 的位置,而如果word字符串的word[0] != ‘a’ 的话,就需要转动,那要转动多久?很简单先计算,第一个字符和 ‘a’ 的间距,但是如果word[0] == ‘z’,我们显然知道只需转动1秒,逆时针转动。而本身有26个字母,除去指针指向,还剩25个,做一个接近平均的分组就是13,12。后面的12指的是间距大于13的12个字符间距。这时候可以用26 减去这个12个数,即为最短转动时间。
然后考虑第二个字符开始,由于第一次可能转动了指针,接下来的字符对应的ascii码值可能小于之前的,所以需要对间距取绝对值。
代码如下(特意用来vs再打了一遍)

// 使用特殊打字机键入单词的最少时间
#include<iostream>
#include<string>
#include<cmath>
using namespace std;

class Solution
{
public:
	int minTimeToType(string word)
	{
		// 设置总时间变量
		int time = 0;
		// 获取字符串长度
		int len = word.size();

		// 遍历字符串, 计算指针转动的最小时间
		for (int i = 0; i < len; i++)
		{
			// 对于首字符,和 a 算间距
			if (i == 0)
			{
				int z = (int)(word[0] - 'a');
				time += z > 13 ? 26 - z : z;
			}
			// 之后的字符,和前一个比较,算间距
			else
			{
				int z = (int)(word[i] - word[i - 1]);
				z = z >= 0 ? z : z * (-1);
				time += z > 13 ? 26 - z : z;
			}
		}
		// 返回转动时间 + 键入时间
		return time + len;
	}
};

int main()
{
	Solution p1;
	string word;
	cin >> word;
	cout << p1.minTimeToType(word) << endl;

	system("pause");

	return 0;
}

第二题,最大方针和

链接:https://leetcode-cn.com/problems/maximum-matrix-sum/
题目和示例见图片
在这里插入图片描述
在这里插入图片描述

解题思路:看完示例,基本上就可以推出一个小结论,这题目不是让你去计算*-1操作,而是算出操作后最大的元素和。
结论:如果负的数字个数是偶数时,最终都能够操作全部为正数。而如果是奇数,那么一定会有一个数为奇数,我们只需令其的绝对值最小即可。

代码如下:

class Solution
{
public:
	long long maxMatrixSum(vector<vector<int>>& matrix)
	{
		// 设置最小值
		int min_value = INT_MAX;
		// 设置总和变量
		long long sum = 0;
		// 获取方阵尺寸
		int n = matrix.size();
		// 设置负数个数变量
		int num = 0;
		// 遍历方阵
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				// 遍历到有负数的情况
				if (matrix[i][j] < 0)
				{
					matrix[i][j] *= -1;
					num++;
				}
				// 每次更新绝对值最小值
				min_value = min(min_value, matrix[i][j]);
				sum += matrix[i][j];
			}
		}
		// 如果负数个数为偶数
		if (num % 2 == 0)
		{
			return sum;
		}
		// 如果为奇数,总和减去最小值的两倍
		return sum - 2 * min_value;
	}
};

这就是前两题的题解,啥?你问我三四题?我要是写的出来会只做前两题嘛?
今天又是被暴打的一天。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值