目录
01
题目:
题解:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int cmp(void* a, void* b)//这里写成void更通用一点
{
return *(int*)a - *(int*)b;
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
//1. 遍历数组
// int* arr = (int*)malloc(sizeof(int)*(nums1Size + nums2Size));
// if(nums1Size == 0 || nums2Size == 0 || (nums1Size == nums2Size == 0))
// {
// return 0;
// }
// for(int i = 0; i < nums1Size; i++)
// {
// int j = 0;
// for(j = 0; j < nums2Size; j++)
// {
// if(nums1[i] == nums2[j])
// arr[i] = nums2[j];
// }
// }
// return arr;
// static int arr[1000];
// *returnSize = 0;
// int i,j,k;
// for(i = 0; i < nums1Size; i++)
// {
// for(j = 0; j < nums2Size; j++)
// {
// if(nums2[j] == nums1[i])//判断nums1[i]是否在nums2[i]中
// break;
// }
// if(j == nums2Size)//nums1中i位置的数据在nums2数组中不存在,则非交集数据
// continue;
// //只有在另一个数组中存在的数据才能走下来,判断是否已经被添加到返回数组中
// for(j = 0; j < *returnSize; j++)
// {
// if(nums1[i] == arr[j])//nums1[i]是否在arr这个返回数组中
// break;
// }
// if(j == *returnSize)//如果不在返回数组中则添加到返回数组中
// {
// arr[*returnSize] = nums1[i];
// *returnSize += 1;//不要忘记修改数组长度
// }
// }
// return arr;
//上面是自己写的,不能过。
//2. 排序+双指针
//先对两个数组进行排序
//创建一个新的数组来接收交集元素
//两数组元素相等
//nums1 < nums2
//nums1 > nums2
*returnSize = 0;
qsort(nums1, nums1Size, sizeof(int), cmp);
qsort(nums2, nums2Size, sizeof(int), cmp);
int* intersection = (int* )malloc(sizeof(int) * (nums1Size + nums2Size));//前面不要加(int*),加了相当于是把空间转换成地址了?没问题。。
int index1 = 0,index2 = 0;
while(index1 < nums1Size && index2 < nums2Size)
{
int num1 = nums1[index1],num2 = nums2[index2];
if(num1 == num2)
{
//这部分代码很简洁,值得借鉴一下
if(!(*returnSize) || num1 != intersection[(*returnSize)-1])//保证加入元素唯一
{
intersection[(*returnSize)++] = num1;//后置++,先赋值再+
}
index1++;
index2++;
}
else if(num1 < num2)
{
index1++;
}
else
{
index2++;
}
}
return intersection;
}
刷题总结:
1. 先想清楚算法思想再写代码
2. 代码能精简的要精简,不要太冗余
点击链接做题
02
题目:
题解:
#include <stdio.h>
int cmp(char* a, char* b)
{
return *a - *b;
}
int main() {
int a, b;
char str[1000] = {0};
while (scanf("%s", str) != EOF) {
//直接使用qsort来排序就OK
int len = strlen(str);
qsort(str,len,sizeof(char),cmp);
printf("%s\n",str);
}
return 0;
}
刷题总结:
对于多种类型数据使用库函数qsort()来排序比较方便
点击链接做题
03
题目:
题解:
// int min(int a, int b)
// {
// if(a >= b)
// return a;
// else
// return b;
// }
// int pivotIndex(int* nums, int numsSize) {
// //从中间分两边求和比较
// //满足就记录下下标,不满足就继续比较
// int mid = numsSize-1;
// int re_mid = 0;
// while(mid >= 0)
// {
// int i = 0;
// int sum_left, sum_right;
// //左边求和
// for(i = 0; i < mid; ++i)
// {
// sum_left += nums[i];
// }
// //右边求和
// for(i = mid + 1; i < numsSize-1; ++i)
// {
// sum_right += nums[i];
// }
// if(sum_left == sum_right)
// {
// re_mid = min(re_mid, mid);
// }
// mid--;
// }
// if(re_mid>=0)
// return re_mid;
// else
// return -1;
// }
//上述自己写的代码
pivotIndex(int* nums, int numsSize) {
int total = 0;
for(int i = 0; i < numsSize; i++)
{
total += nums[i];
}
//从左边开始往右遍历,依次求和
int sum = 0;
for(int i = 0; i < numsSize; i++)
{
if(2 * sum + nums[i] == total)//左右两边的元素之和不包括中间元素在内,要减掉
{
return i;
}
sum += nums[i];
}
return -1;
}
刷题总结:
1. 注意审题,一些细节方面的问题要考虑清楚
点击链接做题
04
题目:
题解:
#include <stdio.h>
int main() {
char str[501] = { 0 };
while (scanf("%s",str) != EOF) {
int num = 0;
char arr[128] = { 0 };
char* tmp = str;
while(*tmp != '\0')
{
if(arr[*tmp] != 1)
{
num++;
}
arr[*tmp++] = 1;
}
printf("%d\n",num);
}
return 0;
}
刷题总结:
1. ASCII码作为数组下标
2. 数组元素具有唯一性
05
题目
题解:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode LNode;
int kthToLast(struct ListNode* head, int k){
//直接遍历
LNode* cur = head;
int len = 0;
while(cur->next)
{
cur = cur->next;
len++;
}
LNode* pcur = head;
int cot = len-k+1;
while(cot--)
{
pcur = pcur->next;
}
return pcur->val;
}
刷题总结:
画图很重要,能看到细节