题目描述
当我们拥有一个整数数组 nums 时,如果任一值在数组中出现至少二次 ,返回 true;否则返回 false
C 语言具体代码实现
我们先谈一种容易被理解的方法!!!
暴力破解法:利用二重循环,将数组内的所有元素进行比较,有相同则返回 true,遍历结束后未发现相同元素则返回 false
#include <stdio.h>
bool containsElements(int *nums, int numsSize){
// 进行最大化的比较
for(int i = 0; i < numsSize; i++){
int temp = nums[i];
for(int j = i+1; j < numsSize; j++){
if(temp == nums[j]){
return true;
}
}
}
return false;
}
int main(void){
int nums[] = {1, 2, 3, 1};
bool ye = containsElements(nums, 4);
if(ye == 1){
printf("true");
}else{
printf("false");
}
}
然后谈一种耗时较少的方法!!!
先排序然后再比较数组相邻元素,当然我想很多人会对排序函数 qsort有疑问,那么如下先介绍一下此函数
qsort函数有四个参数,分别代表着:待排序数组、数组长度、各数据元素占用空间大小和自定义比较函数
如下代码中,待排序数组为 nums,数组长度为 numsSize,数组各数据元素为 int类型,占用大小为 sizeof(int)或 sizeof(nums[0]),比较函数为 cmp;此处特别注意 cmp函数的参数格式是固定的(含有二个常量空指针),也就是说在函数体中,我们先要完成类型转换(如下就用 int*将空指针转换成了整型指针),返回值若是第一个参数减去第二个参数则代表升序,否则代表降序
int cmp(const void* _a, const void* _b){ // 参数格式固定
int *a = (int*)_a; // 强制类型转换
int *b = (int*)_b; // 强制类型转换
return *a - *b; // 升序
}
bool containsDuplicate(int *nums, int numsSize){
qsort(nums, numsSize, sizeof(int), cmp);
for(int i = 0; i < numsSize-1; i++){
if(nums[i] == nums[i+1]){ // 比较相邻元素
return true;
}
}
return false;
}
此处还扩展一下对字符串的排序!!!
排序函数 qsort需要头文件 #include <stdlib.h>
字符串比较函数 strcmp需要头文件 #include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void* _a, const void* _b){ // 参数格式固定
char *a = (char*)_a; // 强制类型转换
char *b = (char*)_b; // 强制类型转换
return strcmp(a, b); // 升序
}
int main(void){
char ch[8] = "loveyou";
qsort(ch, sizeof(ch)/sizeof(ch[0])-1, sizeof(char), cmp);
printf(ch); // eloouvy
return 0;
}