leetcode 22-03-22

今日份 leetcode ,昨天两题,那今天就补上

  • 1822. 数组元素积的符号
  • 1502. 判断能否形成等差数列
  • 202. 快乐数
  • 1790. 仅执行一次字符串交换能否使两个字符串相等

1822. 数组元素积的符号

这道题有点意思,本来想着有点过于简单

1
2
3
4
5
6
7
8
9
10
11
12
13
// C
int signFunc(int x){
if(x == 0) return 0;
return x > 0 ? 1 : -1;
}

int arraySign(int* nums, int numsSize){
int product = nums[0];
for(int i = 1; i < numsSize; i++){
product *= nums[i];
}
return signFunc(product);
}

结果发现溢出了,即使换成 long long int 也是会溢出,还在想着要不转成科学计数法试试,结果发现标题就是答案

解题思路

既然标题就是答案,要求记录最终乘积的符号,那就只记符号就好了

代码

1
2
3
4
5
6
7
8
9
// C
int arraySign(int* nums, int numsSize){
int product = 1;
for(int i = 0; i < numsSize; i++){
if(nums[i] == 0) return 0;
product *= nums[i] > 0 ? 1 : -1;
}
return product;
}

1502. 判断能否形成等差数列

解题思路

先排序,再比较每个值的差是否相等

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// C
int cmp(void *x, void *y){
return *(int *) x - *(int *) y;
}

bool canMakeArithmeticProgression(int* arr, int arrSize){
qsort(arr,arrSize,sizeof(int),cmp);
for(int i = 1; i < arrSize - 1; i++){
if(arr[i] - arr[i - 1] != arr[i + 1] - arr[i]){
return false;
}
}
return true;
}

202. 快乐数

解题思路

将出现过的数记录下来,只要重复出现那就代表循环了,至于数组大小为什么是 810 因为那是我用计算器算的,哈哈🤣,其实应该可以更小点

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// C
int sum(int n){
int s = 0;
while(n != 0){
int t = n % 10;
n /= 10;
s += t * t;
}
return s;
}
bool isHappy(int n){
int t[810] = {0};
if (n == 1) return true;
while(n != 1){
n = sum(n);
if (t[n] > 1) return false;
t[n]++;
}
return true;
}

而且第一次拿这么好的成绩,有点小激动

1790. 仅执行一次字符串交换能否使两个字符串相等

解题思路

标记不相同的下标,然后查看两个下标的元素是否可以交换,相差超过3个必然不能进行交换

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// C
bool areAlmostEqual(char * s1, char * s2){
int len = strlen(s1);
int diff = 0;
int flag[2] = {0};
if (s1 == s2) return true;
for (int i = 0; i < len; i++){
if (s1[i] != s2[i]) {
if (diff == 0) flag[0] = i;
if (diff == 1) flag[1] = i;
diff++;
if (diff > 2) return false;
}
}
if (s1[flag[0]] == s2[flag[1]] && s1[flag[1]] == s2[flag[0]]) return true;
return false;
}