Leetcode【645】牛客网【OR141】C语言 2022-2-23
1.集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组 nums 代表了集合 S 发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
输入:nums = [1,2,2,4] 输出:[2,3]
解法一
int* findErrorNums(int* nums, int numsSize, int* returnSize) { *returnSize = 2; int* ret = (int*)calloc(*returnSize, sizeof(int)); int* arr = (int*)calloc(numsSize, sizeof(int)); for (int i = 0; i < numsSize; i++) { arr[nums[i] - 1]++; } for (int j = 0; j < numsSize; j++) { if (arr[j] == 2) { ret[0] = j + 1; } if (arr[j] == 0) { ret[1] = j + 1; } } free(arr); return ret; }
这个解法巧妙的用了数组下标,先用calloc 对数组置0,在查找多次出现的数字,出现两次和没有出现也就是我们要找的,但是需要多次遍历。
解法二
int* findErrorNums(int* nums, int numsSize, int* returnSize) { *returnSize = 2; int* arr = (int*)calloc(numsSize + 1, sizeof(int)); int* ret = (int*)calloc(*returnSize, sizeof(int)); int cur_sum = 0; int old_sum = 0; for (int i = 0; i < numsSize; i++) { if (arr[nums[i]] == 1) { ret[0] = nums[i]; } arr[nums[i]] = 1; old_sum += i + 1; cur_sum += nums[i]; } ret[1] = old_sum - (cur_sum - ret[0]); free(arr); return ret; }
跟上面一样标记的方式就可以找出重复的数字,数组中出现过哪个数字就把对应数字作为下标在对应位上置1,有了重复的数字,拿 [1, n] 的总和减去去掉重复数据的数组总和就是丢失的数据。
2.小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:
1. 密码只能由大写字母,小写字母,数字构成;
2. 密码不能以数字开头;
3. 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;
4. 密码长度至少为8现在小明受到了n个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的。
输入描述:
输入一个数n,接下来有n(n≤100)行,每行一个字符串,表示一个密码,输入保证字符串中只出现大写字母,小写字母和数字,字符串长度不超过100。
输出描述:
输入n行,如果密码合法,输出YES,不合法输出NO
#include <stdio.h> int main() { int n = 0; while (~scanf_s("%d", &n)) { for (int i = 0; i < n; i++) { char password[101] = { 0 }; scanf_s("%s", password); if (strlen(password) < 8) { printf("NO "); continue; } if (password[0] >= 0 && password <= 9) { printf("NO "); continue; } char* str = password; int upletter = 0; int lowletter = 0; int num = 0; int other = 0; while (*str) { if (*str >= a && *str <= z) { lowletter++; } else if (*str >= A && *str <= Z) { upletter++; } else if (*str >= 0 && *str <= 9) { num++; } else { other++; } str++; } if (other > 0) { printf("NO "); continue; } if ((upletter > 0) + (lowletter > 0) + (num > 0) < 2) { printf("NO "); continue; } printf("YES "); } } return 0; }
下一篇:
实现一个C语言版本的圣诞树(附源代码)