十六、
给定两个字符串
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