C/C++每日一练(20230419) 插入区间、单词拆分、不同路径

简介: C/C++每日一练(20230419) 插入区间、单词拆分、不同路径

1. 插入区间

给你一个 无重叠的按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]

输出:[[1,5],[6,9]]

示例 2:

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]

输出:[[1,2],[3,10],[12,16]]

解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

示例 3:

输入:intervals = [], newInterval = [5,7]

输出:[[5,7]]

示例 4:

输入:intervals = [[1,5]], newInterval = [2,3]

输出:[[1,5]]

示例 5:

输入:intervals = [[1,5]], newInterval = [2,7]

输出:[[1,7]]


提示:

  • 0 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= intervals[i][0] <= intervals[i][1] <= 105
  • intervals 根据 intervals[i][0]升序 排列
  • newInterval.length == 2
  • 0 <= newInterval[0] <= newInterval[1] <= 105

以下程序实现了这一功能,请你填补空白处内容:

```c++
#include <stdio.h>
#include <stdlib.h>
static int compare(const void *a, const void *b)
{
    return ((int *)a)[0] - ((int *)b)[0];
}
int **insert(int **intervals, int intervalsSize, int *intervalsColSize, int *newInterval,
             int newIntervalSize, int *returnSize, int **returnColumnSizes)
{
    int i, len = 0;
    int *tmp = malloc((intervalsSize + 1) * 2 * sizeof(int));
    for (i = 0; i < intervalsSize; i++)
    {
        tmp[i * 2] = intervals[i][0];
        tmp[i * 2 + 1] = intervals[i][1];
    }
    tmp[i * 2] = newInterval[0];
    tmp[i * 2 + 1] = newInterval[1];
    qsort(tmp, intervalsSize + 1, 2 * sizeof(int), compare);
    int **results = malloc((intervalsSize + 1) * sizeof(int *));
    results[0] = malloc(2 * sizeof(int));
    results[0][0] = tmp[0];
    results[0][1] = tmp[1];
    for (i = 1; i < intervalsSize + 1; i++)
    {
        results[i] = malloc(2 * sizeof(int));
        if (tmp[i * 2] > results[len][1])
        {
            len++;
            ________________________;
        }
        else if (tmp[i * 2 + 1] > results[len][1])
        {
            results[len][1] = tmp[i * 2 + 1];
        }
    }
    len += 1;
    *returnSize = len;
    *returnColumnSizes = malloc(len * sizeof(int));
    for (i = 0; i < len; i++)
    {
        (*returnColumnSizes)[i] = 2;
    }
    return results;
}
int main(int argc, char **argv)
{
    if (argc < 3 || argc % 2 == 0)
    {
        fprintf(stderr, "Usage: ./test new_s new_e s0 e0 s1 e1...");
        exit(-1);
    }
    int new_interv[2];
    new_interv[0] = atoi(argv[1]);
    new_interv[1] = atoi(argv[2]);
    int i, count = 0;
    int *size = malloc((argc - 3) / 2 * sizeof(int));
    int **intervals = malloc((argc - 3) / 2 * sizeof(int *));
    for (i = 0; i < (argc - 3) / 2; i++)
    {
        intervals[i] = malloc(2 * sizeof(int));
        intervals[i][0] = atoi(argv[i * 2 + 3]);
        intervals[i][1] = atoi(argv[i * 2 + 4]);
    }
    int *col_sizes;
    int **results = insert(intervals, (argc - 3) / 2, size, new_interv, 2, &count, &col_sizes);
    for (i = 0; i < count; i++)
    {
        printf("[%d,%d]\n", results[i][0], results[i][1]);
    }
    return 0;
}
```

出处:

https://edu.csdn.net/practice/25949978

代码:

#include <stdio.h>
#include <stdlib.h>
static int compare(const void *a, const void *b)
{
    return ((int *)a)[0] - ((int *)b)[0];
}
int **insert(int **intervals, int intervalsSize, int *intervalsColSize, int *newInterval,
             int newIntervalSize, int *returnSize, int **returnColumnSizes)
{
    int i, len = 0;
    int *tmp = (int*)malloc((intervalsSize + 1) * 2 * sizeof(int));
    for (i = 0; i < intervalsSize; i++)
    {
        tmp[i * 2] = intervals[i][0];
        tmp[i * 2 + 1] = intervals[i][1];
    }
    tmp[i * 2] = newInterval[0];
    tmp[i * 2 + 1] = newInterval[1];
    qsort(tmp, intervalsSize + 1, 2 * sizeof(int), compare);
    int **results = (int**)malloc((intervalsSize + 1) * sizeof(int *));
    results[0] = (int*)malloc(2 * sizeof(int));
    results[0][0] = tmp[0];
    results[0][1] = tmp[1];
    for (i = 1; i < intervalsSize + 1; i++)
    {
        results[i] = (int*)malloc(2 * sizeof(int));
        if (tmp[i * 2] > results[len][1])
        {
            len++;
      results[len][0] = tmp[i * 2];
      results[len][1] = tmp[i * 2 + 1];
        }
        else if (tmp[i * 2 + 1] > results[len][1])
        {
            results[len][1] = tmp[i * 2 + 1];
        }
    }
    len += 1;
    *returnSize = len;
    *returnColumnSizes = (int*)malloc(len * sizeof(int));
    for (i = 0; i < len; i++)
    {
        (*returnColumnSizes)[i] = 2;
    }
    return results;
}
int main(int argc, char* argv[])
{
  if (argc<3) return 1;
    int new_interv[2];
    new_interv[0] = atoi((char*)argv[1]);
    new_interv[1] = atoi((char*)argv[2]);
    int i, count = 0;
    int *size = (int*)malloc((argc - 3) / 2 * sizeof(int));
    int **intervals = (int**)malloc((argc - 3) / 2 * sizeof(int *));
    for (i = 0; i < (argc - 3) / 2; i++)
    {
        intervals[i] = (int*)malloc(2 * sizeof(int));
        intervals[i][0] = atoi((char*)argv[i * 2 + 3]);
        intervals[i][1] = atoi((char*)argv[i * 2 + 4]);
    }
    int *col_sizes;
    int **results = insert(intervals, (argc - 3) / 2, size, new_interv, 2, &count, &col_sizes);
    for (i = 0; i < count; i++)
    {
        printf("[%d,%d]\n", results[i][0], results[i][1]);
    }
    return 0;
}

输出:


2. 单词拆分

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

  • 拆分时可以重复使用字典中的单词。
  • 你可以假设字典中没有重复的单词。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]

输出: true

解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。


示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]

输出: true

解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。

    注意你可以重复使用字典中的单词。


示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]

输出: false

出处:

https://edu.csdn.net/practice/25949980

代码:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    bool wordBreak(string s, vector<string> &wordDict)
    {
        map<string, int> tmp;
        for (int i = 0; i < wordDict.size(); i++)
        {
            tmp[wordDict[i]]++;
        }
        int n = s.length();
        vector<bool> res(n + 1, false);
        res[0] = true;
        for (int i = 0; i <= n; i++)
        {
            for (int j = 0; j < i; j++)
            {
                if (res[j] && tmp[s.substr(j, i - j)])
                {
                    res[i] = true;
                    break;
                }
            }
        }
        return res[n];
    }
};
int main()
{
  Solution sol;
    string s = "leetcode";
  vector<string> wordDict = {"leet", "code"};
    cout << (sol.wordBreak(s, wordDict) ? "true" : "false") << endl;
    s = "applepenapple", wordDict = {"apple", "pen"};
  cout << (sol.wordBreak(s, wordDict) ? "true" : "false") << endl;
  s = "catsandog", wordDict = {"cats", "dog", "sand", "and", "cat"};
  cout << (sol.wordBreak(s, wordDict) ? "true" : "false") << endl;
  return 0;
}

输出:

true

true

false


3. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

示例 1:

输入:m = 3, n = 7

输出:28


示例 2:

输入:m = 3, n = 2

输出:3

解释:从左上角开始,总共有 3 条路径可以到达右下角。

1. 向右 -> 向下 -> 向下

2. 向下 -> 向下 -> 向右

3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3

输出:28

示例 4:

输入:m = 3, n = 3

输出:6


提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 109

以下程序实现了这一功能,请你填补空白处内容:

```c
#include 
#include 
static int uniquePaths(int m, int n)
{
    int row, col;
    int *grids = malloc(m * n * sizeof(int));
    for (col = 0; col < m; col++)
    {
        grids[col] = 1;
    }
    for (row = 0; row < n; row++)
    {
        grids[row * m] = 1;
    }
    for (row = 1; row < n; row++)
    {
        for (col = 1; col < m; col++)
        {
            ______________________________;
        }
    }
    return grids[m * n - 1];
}
int main(int argc, char **argv)
{
    if (argc != 3)
    {
        fprintf(stderr, "Usage: ./test m n\n");
        exit(-1);
    }
    printf("%d\n", uniquePaths(atoi(argv[1]), atoi(argv[2])));
    return 0;
}
···

出处:

https://edu.csdn.net/practice/24116334

代码:

#include <stdio.h>
#include <stdlib.h>
static int uniquePaths(int m, int n)
{
    int row, col;
    int *grids = (int*)malloc(m * n * sizeof(int));
    for (col = 0; col < m; col++)
    {
        grids[col] = 1;
    }
    for (row = 0; row < n; row++)
    {
        grids[row * m] = 1;
    }
    for (row = 1; row < n; row++)
    {
        for (col = 1; col < m; col++)
        {
            grids[row * m + col] = grids[row * m + col - 1] + grids[(row - 1) * m + col];
        }
    }
    return grids[m * n - 1];
}
int main()
{
    printf("%d\n", uniquePaths(3, 7));
    printf("%d\n", uniquePaths(3, 2));
    printf("%d\n", uniquePaths(7, 3));
    printf("%d\n", uniquePaths(3, 3));
    return 0;
}

输出:

28

3

28

6


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/


目录
相关文章
|
1天前
|
网络协议 算法 网络架构
Python网络编程之udp编程、黏包以及解决方案、tcpserver
Python网络编程之udp编程、黏包以及解决方案、tcpserver
|
1天前
|
机器学习/深度学习 数据挖掘 算法框架/工具
Python:编程的艺术与魅力
Python:编程的艺术与魅力
9 3
|
4天前
|
机器学习/深度学习 数据挖掘 API
pymc,一个灵活的的 Python 概率编程库!
pymc,一个灵活的的 Python 概率编程库!
10 1
|
4天前
|
人工智能 算法 调度
uvloop,一个强大的 Python 异步IO编程库!
uvloop,一个强大的 Python 异步IO编程库!
16 2
|
4天前
|
机器学习/深度学习 人工智能 数据可视化
Python:探索编程之美
Python:探索编程之美
9 0
|
5天前
|
机器学习/深度学习 人工智能 数据处理
Python编程的魅力与实践
Python编程的魅力与实践
|
6天前
|
SQL 关系型数据库 MySQL
第十三章 Python数据库编程
第十三章 Python数据库编程
|
6天前
|
开发框架 程序员 开发者
Python GUI编程:从入门到精通3.2 GUI编程:学习使用Tkinter、PyQt或wxPython等库创建图形用户界面。
Python GUI编程:从入门到精通3.2 GUI编程:学习使用Tkinter、PyQt或wxPython等库创建图形用户界面。
|
6天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
10天前
|
机器学习/深度学习 IDE 开发工具
《Python 语音转换简易速速上手小册》第2章 Python 编程基础(2024 最新版)(下)
《Python 语音转换简易速速上手小册》第2章 Python 编程基础(2024 最新版)
25 1