DAY_01

目录

01

题目:

题解:

刷题总结:

点击链接做题

02

题目:

题解:

刷题总结:

点击链接做题

03

题目:

 

题解:

 

刷题总结:

 

点击链接做题


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;
}

刷题总结:

画图很重要,能看到细节

链接

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值