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;
}
经验分享 程序员 微信小程序 职场和发展