目录
1.453. 最小操作次数使数组元素相等 - 力扣(LeetCode)
2.665. 非递减数列 - 力扣(LeetCode)
3. 283. 移动零 - 力扣(LeetCode)
4. 3114. 替换字符可以得到的最晚时间 - 力扣(LeetCode)
5. 3115. 素数的最大距离 - 力扣(LeetCode)
1. 453. 最小操作次数使数组元素相等 - 力扣(LeetCode)
小姐姐 你这道题做过你还不知道做啊啊啊啊
首先可以这么想,这道题的本质就是让数组的高度差为0;
每次操作将会使 n-1 个元素增加 1,换句话来说,每次操作可以让 1 个元素减 1;
那么我们就使得所有元素都变成最小值就可以使元素相等了
class Solution {
public:
int minMoves(vector<int>& nums) {
int res = 0;
int min = *min_element(nums.begin(), nums.end());
for(int i = 0; i < nums.size(); i++){
res += nums[i] - min;
// 每次都是只能减1 顺便就当计数器了
}
return res;
}
};
2.665. 非递减数列 - 力扣(LeetCode)
私密马赛,瓦达西菜菜酱没一点思路。。
非递减序列有a,b,c三种形式
需要改变的形式可能会有三种;
对于第①种和第②种我们可以选择对第 i-1 个元素操作或者是第 i 个元素:
把第i个元素变成跟第 i-1 个元素一样大或者把第 i-1 个元素变成跟第 i 个元素一样大。
但是我们选择对第 i-1 个元素操作,因为我们还没有遍历到后面,如果把第 i 个元素改变改成比后面大怎么办
对于第③种情况我们显而易见只能对第i个元素操作
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int flag = 0;
for(int i = 1; i < nums.size(); i++){
if(nums[i] < nums[i-1]){
if(i == 1 || nums[i] >= nums[i-2]){
nums[i-1] = nums[i];
}
else{
nums[i] = nums[i-1];
}
flag++;
}
}
// 最后成为非递减序列看操作次数
if(flag <= 1)
return true;
return false;
}
};
3. 283. 移动零 - 力扣(LeetCode)
这个神似我昨天做的那道题,我弯弯绕绕最后还是做出来了,还是没有真正掌握感觉
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int left = 0, right = 1;
for(int left = 0, right = 0; right < nums.size(); ){
if(nums[right] != 0){
swap(nums[left], nums[right]);
left++, right++;
}
else{
right++;
}
}
}
};
在题解区里面看到一些不一样的做法,撒个尿,标记一下,写一写
4. 3114. 替换字符可以得到的最晚时间 - 力扣(LeetCode)
第一次参加周赛,第一个做出来的题目,也只有这一个哈哈哈哈哈哈哈哈哈哈 小姐姐你。。
先看一下我周赛屎一样的答案
class Solution {
public:
string findLatestTime(string s) {
int i = 0, j = 0;
while(s[0] == '?' || s[1] == '?'){
if(s[0] == '?' && s[1] == '?' ){
s[0] = '1';
}
if(s[0] == '?' && s[1] == '1' || s[1] == '0'){
s[0] = '1';
}
if(s[0] == '?' && s[1] != '?' && s[1] != '1'){
s[0] = '0';
}
if(s[0] == '0' && s[1] == '?'){
s[1] = '9';
}
if(s[0] == '1' && s[1] == '?'){
s[1] = '1';
}
}
while(s[3] == '?' || s[4] == '?'){
if(s[3] == '?'){
s[3] = '5';
}
if(s[3] != '?' && s[4] == '?'){
s[4] = '9';
}
}
return s;
}
};
真的不知道在干吗。。。
就是太急了 然后思路又不清晰 感觉平时有点依赖题解了,到现在简单中等问题应该自己想一想了
看看灵神的直接判断
其实挺简单的我不知道为什么我当时扯7扯8
对于小时:(00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11)
第一个字符不是0就是1;这要看后面第二个字符的影响。如果第二个字符是?那第一个字符就直接取最大的啊——1;如果第二个字符是比1小的那第一个字符就选1,如果第二个字符是比1大的(2,3,4,5,6,7,8,9)就只能选0,因为最大的是11
第二个字符:当第一个字符是0的时候第二个字符最大可以取9;第一个字符是1 的时候最大只能取1了咯
对于分钟:那就简单了
class Solution {
public:
string findLatestTime(string s) {
if (s[0] == '?') {
s[0] = s[1] == '?' || s[1] <= '1' ? '1' : '0';
}
if (s[1] == '?') {
s[1] = s[0] == '1' ? '1' : '9';
}
if (s[3] == '?') {
s[3] = '5';
}
if (s[4] == '?') {
s[4] = '9';
}
return s;
}
};
我知道了,我自己写的时候就是不清楚代码,程序是顺序结构运行的啊,已经先处理了第一个字符,在处理第二个字符时,还要去讨论第一个字符是?的情况
这种短代码写起来好高级的感觉,可是我现在还是if-else...
class Solution {
public:
string findLatestTime(string s) {
if(s[0] == '?' ){
if(s[1] == '?'){
s[0] = '1';
}
else if(s[1] <= '1'){
s[0] = '1';
}
else{
s[0] = '0';
}
}
if(s[1] == '?'){
if(s[0] == '1'){
s[1] = '1';
}
else{
s[1] = '9';
}
}
if(s[3] == '?'){
s[3] = '5';
}
if(s[4] == '?'){
s[4] = '9';
}
return s;
}
};
下面这个方法暴力枚举
class Solution {
public:
string findLatestTime(string s) {
for (int h = 11; ; h--) {
if (s[0] != '?' && s[0] - '0' != h / 10 || s[1] != '?' && s[1] - '0' != h % 10) {
continue;
}
for (int m = 59; m >= 0; m--) {
if (s[3] != '?' && s[3] - '0' != m / 10 || s[4] != '?' && s[4] - '0' != m % 10) {
continue;
}
char ans[6];
sprintf(ans, "%02d:%02d", h, m);
return string(ans);
}
}
}
};
我天呢 搞半天没搞懂 明白了之后感觉好神奇(对不起,我真的很菜)但是我不知道怎么说
首先就是直接从最大的时间开始循环,,,感觉是一个能不能的问题
5. 3115. 素数的最大距离 - 力扣(LeetCode)
不是小姐姐这个也不难啊 你是为什么做不出。。。
因为我还以为要记录下标然后去找最大的TAT,天爷啊,你脑子转个弯呢!!你直接从左边找从右边找不就好!!这不就是两个距离最大的素数!!
class Solution {
bool prime(int n){
// 别写成 i < sqrt(n) 是不对滴
for(int i = 2; i * i <= n; i++){
if(n % i == 0){
return false;
}
}
return n >= 2;
}
public:
int maximumPrimeDifference(vector<int>& nums) {
int i, j;
for(i = 0; i < nums.size(); i++){
if(prime(nums[i]))
break;
}
for(j = nums.size() - 1; j >= 0; j--){
if(prime(nums[j]))
break;
}
return j-i;
}
};