刷题 16-20

 十六、

给定两个字符串 s 和 t ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

示例 1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。

示例 2:

输入:s = "", t = "y"
输出:"y"

解法1:哈希 

char findTheDifference(char* s, char* t) {
    int cnt[26]; // 创建一个大小为26的整型数组cnt,用于记录每个字母出现的次数
    memset(cnt, 0, sizeof(cnt)); // 将cnt数组中的所有元素初始化为0
    int n = strlen(s), m = strlen(t); // 获取字符串s和t的长度
    for (int i = 0; i < n; i++) {
        cnt[s[i] - 'a']++; // 统计字符串s中每个字母出现的次数
    }
    for (int i = 0; i < m; i++) {
        cnt[t[i] - 'a']--; // 在字符串t中遍历每个字母,并将对应字母在cnt数组中的计数减1
        if (cnt[t[i] - 'a'] < 0) { // 如果发现cnt数组中对应字母的计数小于0,说明该字母在字符串t中出现的次数比在字符串s中多,即为不同字符
            return t[i]; // 返回不同字符
        }
    }
    return ' '; // 如果没有找到不同字符,则返回空格
}
char findTheDifference(char* s, char* t) {
    // 定义变量 n 和 m 分别表示字符串 s 和 t 的长度
    int n = strlen(s), m = strlen(t);
    // 定义变量 as 和 at 分别表示字符串 s 和 t 的字符 ASCII 码之和
    int as = 0, at = 0;
    // 计算字符串 s 的字符 ASCII 码之和
    for (int i = 0; i < n; i++) {
        as += s[i];
    }
    // 计算字符串 t 的字符 ASCII 码之和
    for (int i = 0; i < m; i++) {
        at += t[i];
    }
    // 返回字符串 t 的字符 ASCII 码之和减去字符串 s 的字符 ASCII 码之和
    return at - as;
}

 十七、

给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。

示例 1:

输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。

示例 2:

输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。

示例 3:

输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。

int cmp(const void *a, const void *b) {
    return *(int*)a < *(int*)b;
}

int thirdMax(int* nums, int numsSize){
    qsort(nums, numsSize, sizeof(nums[0]), cmp);
    int diff = 0;
    for (int i = 1; i < numsSize; i++) {
        if (nums[i] != nums[i - 1] && ++diff == 2) {
            return nums[i];
        }
    }
    return nums[0];
}

十八、

给定一个非负整数数组 nums,  nums 中一半整数是 奇数 ,一半整数是 偶数 。

对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。

你可以返回 任何满足上述条件的数组作为答案 。

示例 1:

输入:nums = [4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

示例 2:

输入:nums = [2,3]
输出:[2,3]
//用两次for遍历
int* sortArrayByParityII(int* nums, int numsSize, int* returnSize){
	int* ans = malloc(sizeof(int)* numsSize);
	int j = 0, i = 0;
	for (i = 0; i < numsSize;i++ )
	{
		if (nums[i] % 2 ==  0)
			{
                ans[j] = nums[i];
	        	j += 2;
            }
	}
    j=1;
	for (i = 0; i < numsSize; i++)
	{
		if (nums[i] % 2 ==1)
        {
            ans[j] = nums[i];
		j += 2;
        }		
	}
	*returnSize=numsSize;
	return ans;
}

void swap(int* a, int* b) {
    int t = *a;
    *a = *b, *b = t;
}

int* sortArrayByParityII(int* nums, int numsSize, int* returnSize) {
    int j = 1;
    for (int i = 0; i < numsSize; i+=2) {
        if (nums[i] % 2 == 1) {
          
            while (nums[j] % 2 == 1) {
                j += 2;
            }
            swap(nums + i, nums + j);
        }
    }
    *returnSize = numsSize;
    return nums;
}

 十九、

求三角形的最大周长

给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0

示例 1:

输入:nums = [2,1,2]
输出:5
解释:你可以用三个边长组成一个三角形:1 2 2。

示例 2:

输入:nums = [1,2,1,10]
输出:0
解释:
你不能用边长 1,1,2 来组成三角形。
不能用边长 1,1,10 来构成三角形。
不能用边长 1、2 和 10 来构成三角形。
因为我们不能用任何三条边长来构成一个非零面积的三角形,所以我们返回 0。
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int largestPerimeter(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp);
for(int i=numsSize-1;i>=2;--i)
{
    if(nums[i-2]+nums[i-1]>nums[i])
    {
      return nums[i - 2] + nums[i - 1] + nums[i];  
    }
}
return 0;
}

二十、给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

示例 1:

输入:nums = [1,2,3,1]
输出:true

示例 2:

输入:nums = [1,2,3,4]
输出:false

示例 3:

输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true

 用练习题六的解法2,也可以,临时搭建数组全部赋值1,再多一个,既重复

int cmp(const void* a,const void* b)
{
    return *(int *)a-*(int *)b;
}

bool containsDuplicate(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp);
for(int i=0;i

你可能感兴趣的:(算法,排序算法)