leetcode(二)

1、平面上有 n 个点,点的位置用整数座标表示 points[i] = [xi, yi]。请你计算访问所有这些点需要的最小时间(以秒为单位)
你可以按照下面的规则在平面上移动:

  • 每一秒沿水平或者竖直方向移动一个单位长度,或者跨过对角线(可以看作在一秒内向水平和竖直方向各移动一个单位长度)
  • 必须按照数组中出现的顺序来访问这些点
    在这里插入图片描述
int minTimeToVisitAllPoints(int** points, int pointsSize, int* pointsColSize){
int sum=0;
int a,b;
for(int i=0;i<pointsSize-1;i++)
{
    a=abs(points[i][0]-points[i+1][0]);//横座标
    b=abs(points[i][1]-points[i+1][0]);//纵座标
    sum=sum+abs(a-b);
    if(a>b)
    {
        sum=sum+b;
    }
    else
    {
        sum=sum+a;
    }
}
    *pointsColSize=sum;
    return sum;
}

2、请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

现有一个链表 – head = [4,5,1,9],它可以表示为:
在这里插入图片描述

void deleteNode(struct ListNode* node) {
node->val = node->next->val;
node->next = node->next->next;    
}

3、实现一种算法,删除单向链表中间的某个节点(除了第一个和最后一个节点,不一定是中间节点),假定你只能访问该节点。
在这里插入图片描述

void deleteNode(struct ListNode* node) {
    while(node->next!=NULL)
    {
        node->val=node->next->val;
        node->next=node->next->next;
    }
}

4、给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。
在这里插入图片描述

int getDecimalValue(struct ListNode* head){
int sum=0;
struct ListNode *a=head;
while(a!=NULL)
{
    sum=sum*2+a->val;
    a=a->next;
}
return sum;
}

5、实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
在这里插入图片描述

int kthToLast(struct ListNode* head, int k){
struct ListNode *a=head;
struct ListNode *b=head;
    while(k--)
    {
        a=a->next;
    }
    while(a!=NULL)
    {
        a=a->next;
        b=b->next;
    }
return b->val;
}

6、输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* printNumbers(int n, int* returnSize){
int s=1;
    while(n!=0)
    {
        s=s*10;
        n--;
    }
int *a=malloc(sizeof(int)*(s-1));
for(int j=0;j<s-1;j++)
{
    a[j]=j+1;
}
*returnSize=s-1;
return a;
}

7、给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目。

int countNegatives(int** grid, int gridSize, int* gridColSize){
int m=gridSize;
int n=*gridColSize;
int s=0;
for(int i=0;i<m;i++)
{
    for(int j=0;j<n;j++)
    {
        if(grid[i][j]<0)
        s++;
    }
}
return s;
}

8、在一个「平衡字符串」中,‘L’ 和 ‘R’ 字符的数量是相同的。
给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。
返回可以通过分割得到的平衡字符串的最大数量。
在这里插入图片描述

int balancedStringSplit(char * s){
int i=strlen(s);
int a=0;
int b=0;
int sum=0;
for(int j=0;j<i;j++)
{
    {
        if(s[j]=='R')
            a++;
        else if(s[j]=='L')
            b++;
    }
if(a==b)
sum++;
}

return sum;
}

9、请实现一个函数,把字符串 s 中的每个空格替换成"%20"

char* replaceSpace(char* s){
int i=strlen(s);
int m=0;
int n=0;
for(int j=0;j<i;j++)
{
    if(s[j]==' ')
    m++;
}
int *a=malloc(sizeof(int)*(m*3+i+1));
    for(int j=0;j<i;j++)
    {
        if(s[j]!=' ')
        {
            a[n++]=s[j];
        }
        else
        {
            a[n++]='%';
            a[n++]='2';
            a[n++]='0';
        }
    }
a[m*3+i]='\0';
return a;
}

10、桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。

int minCount(int* coins, int coinsSize){
int sum=0;
for(int j=0;j<coinsSize;j++)
{
    while(coins[j]!=0)
    {
        if(coins[j]%2==0)
        {
            coins[j]=coins[j]-2;
            sum++;
        }
        else
        {
            coins[j]=coins[j]-1;
            sum++;
        }
}
}
return sum;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章