C/C++每日一练(20230503) 递增数串、缺失正数、最大矩形

简介: C/C++每日一练(20230503) 递增数串、缺失正数、最大矩形

1. 输出最长的递增数字字符串


如何在一亿位整数组成的字符串中找到最长的递增数字字符串?


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

```c++
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100000
int main()
{
    char buf[MAX_SIZE] = {0};
    int i = 0, len = 0, index = 0;
    char maxbuf[12] = {0};
    char maxbuf2[12] = {0};
    int maxlen = 0;
    gets(buf);
    len = strlen(buf);
    maxbuf2[0] = buf[0];
    i = 1;
    index = 1;
    while (i < len)
    {
        if (buf[i] > buf[i - 1])
        {
            maxbuf2[index] = buf[i];
            index++;
        }
        else
        {
            _________________;
        }
        i++;
    }
    if (index > maxlen)
    {
        maxlen = index;
        strcpy(maxbuf, maxbuf2);
        maxbuf[index] = '\0';
    }
    printf("最大串长度:%d,字符串:%s\n", maxlen, maxbuf);
    return 0;
}
```



出处:

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

代码:

#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100000
int main()
{
    char buf[MAX_SIZE] = {0};
    int i = 0, len = 0, index = 0;
    char maxbuf[12] = {0};
    char maxbuf2[12] = {0};
    int maxlen = 0;
    gets(buf);
    len = strlen(buf);
    maxbuf2[0] = buf[0];
    i = 1;
    index = 1;
    while (i < len)
    {
        if (buf[i] > buf[i - 1])
        {
            maxbuf2[index] = buf[i];
            index++;
        }
        else
        {
            if (index > maxlen)
            {
                maxlen = index;
                strcpy(maxbuf, maxbuf2);
                maxbuf[index] = '\0';
            }
            maxbuf2[0] = buf[i];
            index = 1;
        }
        i++;
    }
    if (index > maxlen)
    {
        maxlen = index;
        strcpy(maxbuf, maxbuf2);
        maxbuf[index] = '\0';
    }
    printf("最大串长度:%d,字符串:%s\n", maxlen, maxbuf);
    return 0;
}


输出:


2. 缺失的第一个正数


给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗?


示例 1:

输入:nums = [1,2,0]

输出:3


示例 2:

输入:nums = [3,4,-1,1]

输出:2


示例 3:

输入:nums = [7,8,9,11,12]

输出:1


提示:

   0 <= nums.length <= 300

   -2^31 <= nums[i] <= 2^31 - 1

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

```c++
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    int firstMissingPositive(vector<int> &nums)
    {
        if (nums.size() == 0)
        {
            return 1;
        }
        int i = 0;
        while (i < nums.size())
        {
            ____________________________;
        }
        for (i = 0; i < nums.size(); i++)
        {
            if (nums[i] != i + 1)
            {
                break;
            }
        }
        return i + 1;
    }
};
```

出处:

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

代码:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    int firstMissingPositive(vector<int> &nums)
    {
        if (nums.size() == 0)
        {
            return 1;
        }
        int i = 0;
        while (i < nums.size())
        {
            if (nums[i] > 0 && nums[i] != i + 1 && nums[i] - 1 < nums.size() && nums[nums[i] - 1] != nums[i])
            {
                swap(nums[i], nums[nums[i] - 1]);
            }
            else
            {
                i++;
            }
        }
        for (i = 0; i < nums.size(); i++)
        {
            if (nums[i] != i + 1)
            {
                break;
            }
        }
        return i + 1;
    }
};
int main()
{
  Solution s;
  vector<int> nums = {1,2,0};
  cout << s.firstMissingPositive(nums) << endl;
  nums = {3,4,-1,1};
  cout << s.firstMissingPositive(nums) << endl;
  nums = {7,8,9,11,12};
  cout << s.firstMissingPositive(nums) << endl;
    return 0;
}


输出:

3

2

1


3. 最大矩形


给定一个仅包含 01 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。


示例 1:

52f17607758af8beae7a87191bff1795.jpeg



输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]

输出:6

解释:最大矩形如上图所示。


示例 2:

输入:matrix = []

输出:0


示例 3:

输入:matrix = [["0"]]

输出:0


示例 4:

输入:matrix = [["1"]]

输出:1


示例 5:

输入:matrix = [["0","0"]]

输出:0


提示:

   rows == matrix.length

   cols == matrix[0].length

   0 <= row, cols <= 200

   matrix[i][j] 为 '0' 或 '1'

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


```c++

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
static inline int max(int a, int b)
{
    return a > b ? a : b;
}
static int area_calc(int *heights, int size)
{
    int *indexes = malloc(size * sizeof(int));
    int *lhist = malloc(size * sizeof(int));
    int *rhist = malloc(size * sizeof(int));
    int i, pos = 0;
    for (i = 0; i < size; i++)
    {
        while (pos > 0 && heights[indexes[pos - 1]] >= heights[i])
        {
            pos--;
        }
        lhist[i] = pos == 0 ? -1 : indexes[pos - 1];
        indexes[pos++] = i;
    }
    pos = 0;
    for (i = size - 1; i >= 0; i--)
    {
        _________________________;
    }
    int max_area = 0;
    for (i = 0; i < size; i++)
    {
        int area = heights[i] * (rhist[i] - lhist[i] - 1);
        max_area = max(area, max_area);
    }
    return max_area;
}
static int maximalRectangle(char **matrix, int matrixRowSize, int matrixColSize)
{
    int i, j, max_area = 0;
    int *heights = malloc(matrixColSize * sizeof(int));
    memset(heights, 0, matrixColSize * sizeof(int));
    for (i = 0; i < matrixRowSize; i++)
    {
        for (j = 0; j < matrixColSize; j++)
        {
            heights[j] = matrix[i][j] == '1' ? heights[j] + 1 : 0;
        }
        max_area = max(max_area, area_calc(heights, matrixColSize));
    }
    return max_area;
}
int main(int argc, char **argv)
{
    if (argc < 2)
    {
        fprintf(stderr, "Usage: ./test row1 row2...\n");
        exit(-1);
    }
    int i, j;
    int row_size = argc - 1;
    int col_size = strlen(argv[1]);
    for (i = 0; i < row_size; i++)
    {
        printf("%s\n", argv[i + 1]);
    }
    printf("%d\n", maximalRectangle(argv + 1, argc - 1, strlen(argv[1])));
    return 0;
}
```



出处:

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

代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
static inline int max(int a, int b)
{
    return a > b ? a : b;
}
static int area_calc(int *heights, int size)
{
    int *indexes = (int*)malloc(size * sizeof(int));
    int *lhist = (int*)malloc(size * sizeof(int));
    int *rhist = (int*)malloc(size * sizeof(int));
    int i, pos = 0;
    for (i = 0; i < size; i++)
    {
        while (pos > 0 && heights[indexes[pos - 1]] >= heights[i])
        {
            pos--;
        }
        lhist[i] = pos == 0 ? -1 : indexes[pos - 1];
        indexes[pos++] = i;
    }
    pos = 0;
    for (i = size - 1; i >= 0; i--)
    {
        while (pos > 0 && heights[indexes[pos - 1]] >= heights[i])
        {
            pos--;
        }
        rhist[i] = pos == 0 ? size : indexes[pos - 1];
        indexes[pos++] = i;
    }
    int max_area = 0;
    for (i = 0; i < size; i++)
    {
        int area = heights[i] * (rhist[i] - lhist[i] - 1);
        max_area = max(area, max_area);
    }
    return max_area;
}
static int maximalRectangle(char **matrix, int matrixRowSize, int matrixColSize)
{
    int i, j, max_area = 0;
    int *heights = (int*)malloc(matrixColSize * sizeof(int));
    memset(heights, 0, matrixColSize * sizeof(int));
    for (i = 0; i < matrixRowSize; i++)
    {
        for (j = 0; j < matrixColSize; j++)
        {
            heights[j] = matrix[i][j] == '1' ? heights[j] + 1 : 0;
        }
        max_area = max(max_area, area_calc(heights, matrixColSize));
    }
    return max_area;
}
int main()
{
  char* matrix[] = {
      (char*)"10100",
      (char*)"10111",
      (char*)"11111",
      (char*)"10010"
  };
    printf("%d\n", maximalRectangle(matrix, 4, 5));
    return 0;
}



输出:

6




目录
相关文章
|
1月前
|
算法 C++
【动态规划】【矩阵】C++算法329矩阵中的最长递增路径
【动态规划】【矩阵】C++算法329矩阵中的最长递增路径
|
1月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
71 1
Linux 终端操作命令(1)
|
1月前
|
算法 测试技术 C++
【动态规划】【C++算法】801. 使序列递增的最小交换次数
【动态规划】【C++算法】801. 使序列递增的最小交换次数
|
1月前
|
Linux 监控 Shell
Linux 终端命令之文件浏览(4) head, tail
Linux 终端命令之文件浏览(4) head, tail
35 0
Linux 终端命令之文件浏览(4) head, tail
|
1月前
|
Shell Linux 机器学习/深度学习
Linux 终端操作命令(3)内部命令用法
Linux 终端操作命令(3)内部命令用法
53 0
Linux 终端操作命令(3)内部命令用法
|
1月前
|
Python Linux Ubuntu
Linux系统部署Python语言开发运行环境
Linux系统部署Python语言开发运行环境
127 0
Linux系统部署Python语言开发运行环境
|
1月前
|
Go Unix 开发者
Go语言time库,时间和日期相关的操作方法
Go语言time库,时间和日期相关的操作方法
66 0
Go语言time库,时间和日期相关的操作方法
|
1月前
|
C++ 存储 Serverless
力扣C++|一题多解之数学题专场(2)
力扣C++|一题多解之数学题专场(2)
33 0
力扣C++|一题多解之数学题专场(2)
|
1月前
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
53 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
|
1月前
|
Java Go C++
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
41 0
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列