C语言刷题
- day01
本篇是C语言刷题大杂烩,收集了笔者遇到的认为有价值的题目,本篇会持续更新~~
day01
至少是其他数字两倍的最大数
题目原文:
题意解析:
请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。
个人思路:
题目要求最大元素大于等于数组其他每个元素的2倍,可能一开始就会直接想遍历数组的所有元素,然后与最大元素一一比较。其实仔细想想,只要最大元素大于等于数组中第二个较大值的2倍就行了,这样就保证了最大元素大于等于数组其他每个元素的2倍。
个人代码:
int dominantIndex(int* nums, int numsSize) {int m1 = -1, m2 = -1;//m1表示最大值,m2表示数组中第二个最大值int index = -1;//最大值下标for (int i = 0; i < numsSize; i++) {if (nums[i] > m1) {m2 = m1;m1 = nums[i];index = i;}else if (nums[i] > m2) {m2 = nums[i];}}return m1 >= m2 * 2 ? index : -1;//三目操作符,值得注意使用
}
两个数组的交集
题目原文:
题目解析:
找出两个数组中相同的元素,存储到动态开辟的新数组中,新数组中的元素是唯一的,不能有重复。
个人思路:
定义一个新数组,把其中一个数组的元素值当作新数组的下标,初始化新数组,这样做的目的是防止数组中的重复元素多次比较。然后把第二个数组的元素值也当作新数组的下标,遍历新数组,如果遍历结果大于0,那么此时下标就是两个元素的交集。
个人代码:
// 两个数组的交集
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {int nums1Cnt[1000] = { 0 };//用于存储、比较两个数组的元素是否相等,int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;//节约空间int* result = (int*)calloc(lessSize, sizeof(int));//动态开辟数组指针int resultIndex = 0;//动态开辟数组下标int* tempNums;int i;for (i = 0; i < nums1Size; i++) {nums1Cnt[nums1[i]]++;//解决数组中有重复的元素}for (i = 0; i < nums2Size; i++) {if (nums1Cnt[nums2[i]] > 0) {result[resultIndex] = nums2[i];resultIndex++;nums1Cnt[nums2[i]] = 0;//防止重复元素的比较}}*returnSize = resultIndex;return result;
}