第一题,特殊打字机键入单词的最少时间
题目链接: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;
}
};
这就是前两题的题解,啥?你问我三四题?我要是写的出来会只做前两题嘛?
今天又是被暴打的一天。。。。