C/C++每日一练(20230329)

简介: C/C++每日一练(20230329)

1. 求前n个素数之和


题目描述

求前n个素数的和。

例如,前5个素数是2、3、5、7、11,它们的和是28。


输入

一个整数n,1<=n<=1000。


输出

前n个素数的和

样例输入

5

样例输出

28

提示

第1000个素数是7919。


出处:

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

代码:

#include <iostream>
using namespace std;
int main()
{
    int n, i, j, sum, a;
    cin >> n;
    a = 0;
    i = 2;
    sum = 0;
    while (a < n)
    {
    for (j = 2; j <= i; j++)
        if (i % j == 0)
            break;
        if (j == i)
        {
            sum += i;
            ++a;
        }
        ++i;
    }
    cout << sum;
}

输入输出:

5

28

1000

3682913




2. 柱状图中最大的矩形



给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。


947ba982417b598ee8de378ac4b1c2bf.png



以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]

2873fce06be97533e2bc5b5384510f67.png

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。



示例:

输入: [2,1,5,6,2,3]

输出: 10

出处:

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

代码:

#include <stdio.h>
#include <stdlib.h>
static int largestRectangleArea(int *heights, int heightsSize)
{
    int *indexes = (int*)malloc(heightsSize * sizeof(int));
    int *left = (int*)malloc(heightsSize * sizeof(int));
    int *right = (int*)malloc(heightsSize * sizeof(int));
    int i, pos = 0;
    for (i = 0; i < heightsSize; i++)
    {
        while (pos > 0 && heights[indexes[pos - 1]] >= heights[i])
        {
            pos--;
        }
        left[i] = pos == 0 ? -1 : indexes[pos - 1];
        indexes[pos++] = i;
    }
    pos = 0;
    for (i = heightsSize - 1; i >= 0; i--)
    {
        while (pos > 0 && heights[indexes[pos - 1]] >= heights[i])
        {
            pos--;
        }
        right[i] = pos == 0 ? heightsSize : indexes[pos - 1];
        indexes[pos++] = i;
    }
    int max_area = 0;
  for (i = 0; i < heightsSize; i++)
  {
      int area = heights[i] * (right[i] - left[i] - 1);
      max_area = area > max_area ? area : max_area;
  }
    return max_area;
}
int main(void)
{
    int nums[] = {2, 1, 5, 6, 2, 3};
    int count = sizeof(nums) / sizeof(*nums);
    printf("%d\n", largestRectangleArea(nums, count));
    return 0;
}


输出:

10


3. 解数独


编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则


  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。

示例:

ed59800c64b76b1efa62aa77747f5330.png


输入:board =  

[["5","3",".",".","7",".",".",".","."],

["6",".",".","1","9","5",".",".","."],

[".","9","8",".",".",".",".","6","."],

["8",".",".",".","6",".",".",".","3"],

["4",".",".","8",".","3",".",".","1"],

["7",".",".",".","2",".",".",".","6"],

[".","6",".",".",".",".","2","8","."],

[".",".",".","4","1","9",".",".","5"],

[".",".",".",".","8",".",".","7","9"]]

输出:

[["5","3","4","6","7","8","9","1","2"],

["6","7","2","1","9","5","3","4","8"],

["1","9","8","3","4","2","5","6","7"],

["8","5","9","7","6","1","4","2","3"],

["4","2","6","8","5","3","7","9","1"],

["7","1","3","9","2","4","8","5","6"],

["9","6","1","5","3","7","2","8","4"],

["2","8","7","4","1","9","6","3","5"],

["3","4","5","2","8","6","1","7","9"]]

解释:输入的数独如上图所示,唯一有效的解决方案如下所示:


3d74b48c1652fc4320bc5986162756f0.png



提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字或者 '.'
  • 题目数据 保证 输入数独仅有一个解

出处:

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

代码:


#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    void solveSudoku(vector<vector<char>> &board)
    {
        int size = board.size();
        vector<vector<bool>> rows(size, vector<bool>(10));
        vector<vector<bool>> cols(size, vector<bool>(10));
        vector<vector<bool>> boxes(size, vector<bool>(10));
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                if (board[i][j] != '.')
                {
                    int num = board[i][j] - '0';
                    int idx = i / 3 * 3 + j / 3;
                    rows[i][num] = true;
                    cols[j][num] = true;
                    boxes[idx][num] = true;
                }
            }
        }
        dfs(board, 0, rows, cols, boxes);
    }
private:
    bool valid(int num, int row, int col, int idx, vector<vector<bool>> &rows,
               vector<vector<bool>> &cols, vector<vector<bool>> &boxes)
    {
        return !rows[row][num] && !cols[col][num] && !boxes[idx][num];
    }
    bool dfs(vector<vector<char>> &board, int size, vector<vector<bool>> &rows,
             vector<vector<bool>> &cols, vector<vector<bool>> &boxes)
    {
        if (size == 9 * 9)
        {
            return true;
        }
        else
        {
            bool ok = false;
            int row = size / 9;
            int col = size % 9;
            int idx = row / 3 * 3 + col / 3;
            if (board[row][col] == '.')
            {
                for (int i = 1; i <= 9; i++)
                {
                    if (valid(i, row, col, idx, rows, cols, boxes))
                    {
                        board[row][col] = i + '0';
                        rows[row][i] = true;
                        cols[col][i] = true;
                        boxes[idx][i] = true;
                        ok = dfs(board, size + 1, rows, cols, boxes);
                        if (!ok)
                        {
                            rows[row][i] = false;
                            cols[col][i] = false;
                            boxes[idx][i] = false;
                            board[row][col] = '.';
                        }
                    }
                }
            }
            else
            {
                ok = dfs(board, size + 1, rows, cols, boxes);
            }
            return ok;
        }
    }
};
int main(void)
{
    vector<vector<char>> board = {
    {'5','3','.','.','7','.','.','.','.'},
    {'6','.','.','1','9','5','.','.','.'},
    {'.','9','8','.','.','.','.','6','.'},
    {'8','.','.','.','6','.','.','.','3'},
    {'4','.','.','8','.','3','.','.','1'},
    {'7','.','.','.','2','.','.','.','6'},
    {'.','6','.','.','.','.','2','8','.'},
    {'.','.','.','4','1','9','.','.','5'},
    {'.','.','.','.','8','.','.','7','9'}};
  Solution s;
  s.solveSudoku(board);
  for(auto row: board){
    for (auto col: row)
      cout << col << " ";
    cout << endl;
  }
    return 0;
}

输出:

5 3 4 6 7 8 9 1 2

6 7 2 1 9 5 3 4 8

1 9 8 3 4 2 5 6 7

8 5 9 7 6 1 4 2 3

4 2 6 8 5 3 7 9 1

7 1 3 9 2 4 8 5 6

9 6 1 5 3 7 2 8 4

2 8 7 4 1 9 6 3 5

3 4 5 2 8 6 1 7 9





目录
相关文章
|
8月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
111 1
Linux 终端操作命令(1)
|
8月前
|
算法 Java Go
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
57 1
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
|
8月前
|
Linux 监控 Shell
Linux 终端命令之文件浏览(4) head, tail
Linux 终端命令之文件浏览(4) head, tail
76 0
Linux 终端命令之文件浏览(4) head, tail
|
8月前
|
Shell Linux 机器学习/深度学习
Linux 终端操作命令(3)内部命令用法
Linux 终端操作命令(3)内部命令用法
114 0
Linux 终端操作命令(3)内部命令用法
|
8月前
|
Python Linux Ubuntu
Linux系统部署Python语言开发运行环境
Linux系统部署Python语言开发运行环境
245 0
Linux系统部署Python语言开发运行环境
|
8月前
|
Go Unix 开发者
Go语言time库,时间和日期相关的操作方法
Go语言time库,时间和日期相关的操作方法
128 0
Go语言time库,时间和日期相关的操作方法
|
8月前
|
C++ 存储 Serverless
力扣C++|一题多解之数学题专场(2)
力扣C++|一题多解之数学题专场(2)
58 0
力扣C++|一题多解之数学题专场(2)
|
8月前
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
108 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
|
8月前
|
Java Go C++
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
72 0
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
|
8月前
|
Java Go C++
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort
65 0
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort