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\n");
continue;
}
if (password[0] >= '0' && password <= '9') {
printf("NO\n");
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\n");
continue;
}
if ((upletter > 0) + (lowletter > 0) + (num > 0) < 2) {
printf("NO\n");
continue;
}
printf("YES\n");
}
}
return 0;
}