选择题:
题一:
题二:
题三:
题四:
题五:
编程题:
题一:错误的集合
645. 错误的集合 - 力扣(LeetCode)
思路一:
排序法:由于题目没有说明数组是否有序,所以需要我们自己将数组排序,才能去遍历;同时需要知道的是returnSize是指返回数组元素的个数。
第一步:使用qsort()函数将数组排序成升序;
第二步:为返回值数组开辟动态内存空间,否则在出函数时会释放;
第三步:定义一个数来记录数组的前一个数;
第四步:遍历数组:相同记录为num[0],数组当前元素-前一个元素值大于一说明中间的就是缺的元素num[1];
第五步:如果最后一个元素不等于长度,说明最后一个就是缺的元素。
int my_cmp(const void* p1,const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
//将数组进行升序排序
qsort(nums,numsSize,4,my_cmp);
//returnSize为返回数组元素个数
*returnSize = 2;
//开辟动态内存空间,否则在出函数时会释放
int* num = (int*)malloc(sizeof(int)*2);
//定义数组的前一个数
int front = 0;
//遍历数组
for(int i = 0; i < numsSize;i++ )
{
//相同记录为num[0]
if(nums[i] == front)
{
num[0] = nums[i];
}
//数组当前元素-前一个元素值大于一说明中间的就是缺的元素
else if(nums[i] - front > 1)
{
num[1] = nums[i]-1;
}
front = nums[i];
}
//最后一个元素不等于长度,说明最后一个就是缺的元素
if(nums[numsSize-1] != numsSize)
{
num[1] = numsSize;
}
return num;
}
思路二:
使用标记的方式就可以找出重复的数字,数组中出现过哪个数字就把对应数字作为下标在对应位置1,表示已经标记出现过,如果哪个数据对应位已经置1,则表示就是重复的数字。有了重复的数字,拿 [1, n] 的总和减去去掉重复数据的数组总和就是丢失的数据。 其实使用标记法时出现的数字对应位每次 ++ ,则最后出现0次的就是丢失,出现2次的就是重复的,这样的方式也可以,不过需要多次遍历。
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
*returnSize = 2;
//遍历nums数组,将其中数据对应的位置1, 哪一位如果已经重置过则意味着数据重复了
int *arr = (int *)calloc(numsSize + 1, sizeof(int));//申请numsSize个整形空间,并初始化为0
int *ret = (int *)calloc(*returnSize, sizeof(int));//申请2个整形空间,并初始化为0
int cur_sum = 0, old_sum = 0;
for (int i = 0; i < numsSize; i++) {
if (arr[nums[i]] == 1)
{ //这个数字在上边数组的对应位置已经置过1了,则重复
ret[0] = nums[i];//找到重复的数字
}
arr[nums[i]] = 1; //将标记数组的对应数据位置1
old_sum += i + 1; // 1~n的求和
cur_sum += nums[i]; //当前数组中的数据求和(多了一个重复的,少了一个丢失的)
}
ret[1] = old_sum - (cur_sum - ret[0]);//原始总和,减去去掉重复后的当前总和就是丢失的数字
free(arr);
return ret;
}
题二:密码检查
密码检查_牛客题霸_牛客网 (nowcoder.com)
思路一:
暴力的不能再暴力的方法:
第一步:创建输入密码数量的n,和字符串arr;
第二步:for循环遍历,创建用于记录密码的字符是否正确count,顺便求字符串长度;
第三步:判断字符串长度是否合法;
第四步:遍历一遍字符串,格式正确就记录count;
第五步:最后将字符串长度与count比较,相同“YES”,反之“NO”。
int main()
{
int n = 0;
scanf("%d",&n);
//字符串长度限制
char arr[100] = {0};
//密码个数
for(int j = 0;j < n;j++)
{
scanf("%s",arr);
//用于记录密码的字符是否正确
int count =0;
//字符串长度
int sz = strlen(arr);
//是否符合长度要求
if(sz >= 8 && sz <= 100)
{
//遍历一遍字符串,格式正确就记录
for(int i = 0;i < sz;i++)
{
if(arr[i] >= 'A' && arr[i] <='Z'||
arr[i] >= 'a' && arr[i] <='z' ||
arr[i] >= '0' && arr[i] <='9')
{
count++;
}
}
}
//长度对比
if(sz == count)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!