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

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

1. 阶乘后的零


给定一个整数 n ,返回 n! 结果中尾随零的数量。


提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

示例 1:

输入:n = 3

输出:0


解释:3! = 6 ,不含尾随 0


示例 2:

输入:n = 5

输出:1

解释:5! = 120 ,有一个尾随 0


示例 3:

输入:n = 0


输出:0


提示:

   0 <= n <= 10^4

进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?

出处:

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

代码:



#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    int trailingZeroes(int n)
    {
        int numOfZeros = 0;
        while (n > 0)
        {
            numOfZeros += numOf5(n);
            n--;
        }
        return numOfZeros;
    }
    int numOf5(int num)
    {
        int count = 0;
        while ((num > 1) && (num % 5 == 0))
        {
            count++;
            num /= 5;
        }
        return count;
    }
};
int main()
{
    Solution s;
    cout << s.trailingZeroes(3) << endl;
    cout << s.trailingZeroes(5) << endl;
    cout << s.trailingZeroes(0) << endl;
    cout << s.trailingZeroes(100) << endl;
    return 0;
}


输出:

0

1

0

24

代码2:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    int trailingZeroes(int n)
    {
        int numOfZeros = 0;
        int multiple = 5;
        while (n >= multiple)
        {
            numOfZeros += int(n / multiple);
            multiple *= 5;
        }
        return numOfZeros;
    }
};
int main()
{
    Solution s;
    cout << s.trailingZeroes(3) << endl;
    cout << s.trailingZeroes(5) << endl;
    cout << s.trailingZeroes(0) << endl;
    cout << s.trailingZeroes(100) << endl;
    return 0;
}



2. 不同路径 II


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

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

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?


dcc604a2757b6fd0e6bdc5155c945ffc.png


网格中的障碍物和空位置分别用 10 来表示。

示例 1:

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]



输出:2

解释:3x3 网格的正中间有一个障碍物。从左上角到右下角一共有 2 条不同的路径:

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

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



示例 2:

d95382b3c9b30e83be3e383421106a67.jpeg

输入:obstacleGrid = [[0,1],[0,0]]

输出:1



提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j]01

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

```c++

#include <stdio.h>
#include <stdlib.h>
static int uniquePathsWithObstacles(int **obstacleGrid, int obstacleGridRowSize, int obstacleGridColSize)
{
    int row, col;
    int reset = 0;
    for (row = 0; row < obstacleGridRowSize; row++)
    {
        if (reset)
        {
            obstacleGrid[row][0] = 1;
        }
        else
        {
            if (obstacleGrid[row][0] == 1)
            {
                reset = 1;
            }
        }
    }
    reset = 0;
    for (col = 0; col < obstacleGridColSize; col++)
    {
        if (reset)
        {
            obstacleGrid[0][col] = 1;
        }
        else
        {
            if (obstacleGrid[0][col] == 1)
            {
                reset = 1;
            }
        }
    }
    for (row = 0; row < obstacleGridRowSize; row++)
    {
        int *line = obstacleGrid[row];
        for (col = 0; col < obstacleGridColSize; col++)
        {
            line[col] ^= 1;
        }
    }
    for (row = 1; row < obstacleGridRowSize; row++)
    {
        int *last_line = obstacleGrid[row - 1];
        int *line = obstacleGrid[row];
        for (col = 1; col < obstacleGridColSize; col++)
        {
            ________________________;
        }
    }
    return obstacleGrid[obstacleGridRowSize - 1][obstacleGridColSize - 1];
}
int main(int argc, char **argv)
{
    if (argc < 3)
    {
        fprintf(stderr, "Usage: ./test m n\n");
        exit(-1);
    }
    int i, j, k = 3;
    int row_size = atoi(argv[1]);
    int col_size = atoi(argv[2]);
    int **grids = malloc(row_size * sizeof(int *));
    for (i = 0; i < row_size; i++)
    {
        grids[i] = malloc(col_size * sizeof(int));
        int *line = grids[i];
        for (j = 0; j < col_size; j++)
        {
            line[j] = atoi(argv[k++]);
            printf("%d ", line[j]);
        }
        printf("\n");
    }
    printf("%d\n", uniquePathsWithObstacles(grids, row_size, col_size));
    return 0;
}
```



出处:

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

代码:

#include <iostream>
using namespace std;
static int uniquePathsWithObstacles(int **obstacleGrid, int obstacleGridRowSize, int obstacleGridColSize)
{
    int row, col;
    int reset = 0;
    for (row = 0; row < obstacleGridRowSize; row++)
    {
        if (reset)
        {
            obstacleGrid[row][0] = 1;
        }
        else
        {
            if (obstacleGrid[row][0] == 1)
            {
                reset = 1;
            }
        }
    }
    reset = 0;
    for (col = 0; col < obstacleGridColSize; col++)
    {
        if (reset)
        {
            obstacleGrid[0][col] = 1;
        }
        else
        {
            if (obstacleGrid[0][col] == 1)
            {
                reset = 1;
            }
        }
    }
    for (row = 0; row < obstacleGridRowSize; row++)
    {
        int *line = obstacleGrid[row];
        for (col = 0; col < obstacleGridColSize; col++)
        {
            line[col] ^= 1;
        }
    }
    for (row = 1; row < obstacleGridRowSize; row++)
    {
        int *last_line = obstacleGrid[row - 1];
        int *line = obstacleGrid[row];
        for (col = 1; col < obstacleGridColSize; col++)
        {
      if (line[col] != 0)
      {
          line[col] = line[col - 1] + last_line[col];
      }
        }
    }
    return obstacleGrid[obstacleGridRowSize - 1][obstacleGridColSize - 1];
}
int main()
{
  int row = 3, col = 3;
  int **grids = new int*[row]{new int[col]{0,0,0}, new int[col]{0,1,0}, new int[col]{0,0,0}};
    cout << uniquePathsWithObstacles(grids, row, col) << endl;
  row = 2, col = 2;
  int **grids2 = new int*[row]{new int[col]{0,1}, new int[col]{0,0}};
    cout << uniquePathsWithObstacles(grids2, row, col) << endl;
    return 0;
}


输出:

2

1

数组改为vector:

#include <iostream>
#include <vector>
using namespace std;
static int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid)
{
    int obstacleGridRowSize = obstacleGrid.size();
    int obstacleGridColSize = obstacleGrid[0].size();
    int row, col, reset = 0;
    for (row = 0; row < obstacleGridRowSize; row++)
    {
        if (reset)
            obstacleGrid[row][0] = 1;
        else if (obstacleGrid[row][0] == 1)
            reset = 1;
    }
    reset = 0;
    for (col = 0; col < obstacleGridColSize; col++)
    {
        if (reset)
            obstacleGrid[0][col] = 1;
        else if (obstacleGrid[0][col] == 1)
            reset = 1;
    }
    for (row = 0; row < obstacleGridRowSize; row++)
    {
        vector<int>& line = obstacleGrid[row];
        for (int col = 0; col < obstacleGridColSize; col++)
            line[col] ^= 1;
    }
    for (row = 1; row < obstacleGridRowSize; row++)
    {
        vector<int>& last_line = obstacleGrid[row - 1];
        vector<int>& line = obstacleGrid[row];
        for (int col = 1; col < obstacleGridColSize; col++)
            if (line[col] != 0)
                line[col] = line[col - 1] + last_line[col];
    }
    return obstacleGrid[obstacleGridRowSize - 1][col - 1];
}
int main()
{
    vector<vector<int>> grids = {{0,0,0}, {0,1,0}, {0,0,0}};
    cout << uniquePathsWithObstacles(grids) << endl;
    vector<vector<int>> grids2 = {{0,1}, {0,0}};
    cout << uniquePathsWithObstacles(grids2) << endl;
    return 0;
}


3. 爬楼梯


假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?


注意:给定 n 是一个正整数。

示例 1:

输入: 2

输出: 2

解释: 有两种方法可以爬到楼顶。

1.  1 阶 + 1 阶

2.  2 阶


示例 2:

输入: 3

输出: 3

解释: 有三种方法可以爬到楼顶。

1.  1 阶 + 1 阶 + 1 阶

2.  1 阶 + 2 阶

3.  2 阶 + 1 阶

出处:

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


代码:


#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    int climbStairs(int n)
    {
        int a = 1;
        int b = 2;
        int c = 0;
        for (int i = 3; i <= n; i++)
        {
            c = a + b;
            a = b;
            b = c;
        }
        return n == 1 ? a : (n == 2 ? b : c);
    }
};


输出:

略,这题简单的,本质就是斐波那契数列。

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