【每日刷题】Day21

发布于:2024-04-26 ⋅ 阅读:(27) ⋅ 点赞:(0)

【每日刷题】Day21

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 73. 矩阵置零 - 力扣(LeetCode)

2. LCR 027. 回文链表 - 力扣(LeetCode)

3. 面试题 02.05. 链表求和 - 力扣(LeetCode)

1. 73. 矩阵置零 - 力扣(LeetCode)

//思路:暴力求解。创建两个数组arr1、arr2,arr1数组用于存放0元素的x坐标,arr2数组用于存放0元素的y坐标。然后暴力遍历两个数组,定位原数组0元素的位置,将0元素所在行、列元素全部置为0

void setZeroes(int** matrix, int matrixSize, int* matrixColSize)

{

    int arr1[201] = {0};//存放0元素x坐标

    int arr2[201] = {0};//存放0元素y坐标

    int num = 0;

    for(int i = 0;i<matrixSize;i++)

    {

        for(int j = 0;j<(*matrixColSize);j++)

        {

            if(matrix[i][j]==0)

            {

                arr1[num] = i;

                arr2[num] = j;

                num++;

            }

        }

    }

    for(int i = 0;i<num;i++)

    {

        int x = arr1[i];

        for(int tmp1 = 0;tmp1<(*matrixColSize);tmp1++)//将0元素所在行元素全部置为0

        {

            matrix[x][tmp1] = 0;

        }

        int y = arr2[i];

        for(int tmp2 = 0;tmp2<matrixSize;tmp2++)//将0元素所在列元素全部置为0

        {

            matrix[tmp2][y] = 0;

        }

    }

}

2. LCR 027. 回文链表 - 力扣(LeetCode)

//思路:使用数组将链表中的值存储起来,然后使用两个指针从数组的两端遍历比较,大小不相等直接return false

typedef struct ListNode LN;

bool isPalindrome(struct ListNode* head)

{

    int arr[100001];

    int i = 0;

    LN* pmove = head;

    while(pmove)

    {

        arr[i++] = pmove->val;

        pmove = pmove->next;

    }

    for(int j = 0;j<i/2;j++)

    {

        if(arr[j]!=arr[i-j-1])

        {

            return false;

        }

    }

    return true;

}

3. 面试题 02.05. 链表求和 - 力扣(LeetCode)

//思路:这题和67. 二进制求和 - 力扣(LeetCode)非常相似,如果选择将两个链表的数求出来后再相加的话,就会面临数据过大导致无法存储的情况。那么这个时候我们可以和二进制求和这题一样,将每个位相加,使用一个变量来判断是否需要进1,将进的1带入下一个相加的位相加,以此类推。

typedef struct ListNode LN;

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)

{

    int flag = 0;

    LN* pmove1 = l1;

    LN* pmove2 = l2;

    LN* newhead = (LN*)malloc(sizeof(LN));

    LN* pmove = newhead;

    while(pmove1||pmove2)

    {

        LN* newnode = (LN*)malloc(sizeof(LN));

        int x = (pmove1)?pmove1->val:0;//获取链表1中节点的数据,这里使用这种方法是为了避免pmove1为NULL还对其进行解引用操作

        int y = (pmove2)?pmove2->val:0;//获取链表2中节点的数据

        newnode->val = (x+y+flag)%10;

        newnode->next = NULL;

        if(x+y+flag>=10)//如果需要进位,将flag置为1

        {

            flag = 1;

        }

        else

        {

            flag = 0;//否则,置为0

        }

        if(pmove1)//放置对空指针解引用

        {

            pmove1 = pmove1->next;

        }

        if(pmove2)//同上

        {

            pmove2 = pmove2->next;

        }

        pmove->next = newnode;

        pmove = pmove->next;

    }

    if(flag)//如果出了循环以后flag还是1,则说明最后一位也进了1,这时候需要在新链表末尾多添上一个1

    {

        LN* newnode = (LN*)malloc(sizeof(LN));

        newnode->val = 1;

        newnode->next = NULL;

        pmove->next = newnode;

    }

    return newhead->next;

}


网站公告

今日签到

点亮在社区的每一天
去签到