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

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