C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除

简介: C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除

1. 岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [

["1","1","1","1","0"],

["1","1","0","1","0"],

["1","1","0","0","0"],

["0","0","0","0","0"]

]

输出:1


示例 2:

输入:grid = [

["1","1","0","0","0"],

["1","1","0","0","0"],

["0","0","1","0","0"],

["0","0","0","1","1"]

]

输出:3


提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0''1'

出处:

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

代码:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    void DFS(vector<vector<int>> &mark, vector<vector<char>> &grid, int x, int y)
    {
        mark[x][y] = 1;
        static const int dx[] = {-1, 1, 0, 0};
        static const int dy[] = {0, 0, -1, 1};
        for (int i = 0; i < 4; i++)
        {
            int newx = dx[i] + x;
            int newy = dy[i] + y;
            if (newx < 0 || newx >= mark.size() || newy < 0 || newy >= mark[newx].size())
            {
                continue;
            }
            if (mark[newx][newy] == 0 && grid[newx][newy] == '1')
            {
                DFS(mark, grid, newx, newy);
            }
        }
    }
    int numIslands(vector<vector<char>> &grid)
    {
        int island_num = 0;
        vector<vector<int>> mark;
        for (int i = 0; i < grid.size(); i++)
        {
            mark.push_back(vector<int>());
            for (int j = 0; j < grid[i].size(); j++)
            {
                mark[i].push_back(0);
            }
        }
        for (int i = 0; i < grid.size(); i++)
        {
            for (int j = 0; j < grid[i].size(); j++)
            {
                if (mark[i][j] == 0 && grid[i][j] == '1')
                {
                    DFS(mark, grid, i, j);
                    island_num++;
                }
            }
        }
        return island_num;
    }
};
int main()
{
  Solution s;
  vector<vector<char>> grid = {
      {'1','1','1','1','0'},
      {'1','1','0','1','0'},
      {'1','1','0','0','0'},
      {'0','0','0','0','0'}};
    cout << s.numIslands(grid) << endl;
  grid = {
      {'1','1','0','0','0'},
      {'1','1','0','0','0'},
      {'0','0','1','0','0'},
      {'0','0','0','1','1'}};
    cout << s.numIslands(grid) << endl;
  return 0;
} 

输出:

1

3


2. 出现最多的整数及次数

原标题:计算出现次数最多的整数及其出现次数

【问题描述】 输入一组无序的整数,编程输出其中出现次数最多的整数及其出现次数。

【输入形式】

先从标准输入读入整数的个数(大于等于1,小于等于100),然后在下一行输入这些整数,各整数之间以一个空格分隔。

【输出形式】

标准输出上输出出现次数最多的整数及其出现次数,两者以一个空格分隔;若出现次数最多的整数有多个,则按照整数升序分行输出。

【样例输入】

10

0 -50 0 632 5813 -50 9 -50 0 632

【样例输出】

-50 3

0 3

【样例说明】

输入了10个整数,其中出现次数最多的是-50和0,都是出现3次。

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

···c++
#include 
int main()
{
    int a[50], b[50], c[50], n, i, j, t, max;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    for (i = 1; i < n; i++)
        for (j = 0; j < n - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    j = 0;
    t = -1;
    for (i = 0; i < n - 1; i++)
    {
        ____________________;
    }
    b[j] = n - 1 - t;
    c[j] = n - 1;
    max = b[0];
    for (i = 1; i <= j; i++)
    {
        if (max < b[i])
        {
            max = b[i];
        }
    }
    for (i = 0; i <= j; i++)
        if (b[i] == max)
        {
            t = c[i];
            printf("%d %d\n", a[t], b[i]);
        }
    return 0;
}
```

出处:

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

代码:

#include <stdio.h>
int main()
{
    int a[50], b[50], c[50], n, i, j, t, max;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    for (i = 1; i < n; i++)
        for (j = 0; j < n - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    j = 0;
    t = -1;
    for (i = 0; i < n - 1; i++)
    {
    if (a[i] != a[i + 1])
    {
        b[j] = i - t;
        c[j] = i;
        t = i;
        j++;
    }
    }
    b[j] = n - 1 - t;
    c[j] = n - 1;
    max = b[0];
    for (i = 1; i <= j; i++)
    {
        if (max < b[i])
        {
            max = b[i];
        }
    }
    for (i = 0; i <= j; i++)
        if (b[i] == max)
        {
            t = c[i];
            printf("%d %d\n", a[t], b[i]);
        }
    return 0;
}

输入输出:

10

0 -50 632 0 5813 -50 9 -50 0 632

-50 3

0 3


3. 两数相除

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

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例 1:

输入: dividend = 10, divisor = 3

输出: 3

解释: 10/3 = truncate(3.33333..) = truncate(3) = 3

示例 2:

输入: dividend = 7, divisor = -3

输出: -2

解释: 7/-3 = truncate(-2.33333..) = -2


提示:

  • 被除数和除数均为 32 位有符号整数。
  • 除数不为 0。
  • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31,  2^31 − 1]。本题中,如果除法结果溢出,则返回 2^31 − 1。
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    int divide(int dividend, int divisor)
    {
        int signal = 1;
        unsigned int dvd = dividend;
        if (dividend < 0)
        {
            signal *= -1;
            dvd = ~dvd + 1;
        }
        unsigned int dvs = divisor;
        if (divisor < 0)
        {
            signal *= -1;
            dvs = ~dvs + 1;
        }
        int shift = 0;
        while (dvd > dvs << shift)
        {
            shift++;
        }
        unsigned int res = 0;
        while (dvd >= dvs)
        {
      while (dvd < dvs<<shift)
      {
          shift--;
      }
      res |= (unsigned int)1 << shift;
      dvd -= dvs << shift;
        }
        if (signal == 1 && res >= INT_MAX)
        {
            return INT_MAX;
        }
        else
        {
            return res * signal;
        }
    }
};
int main()
{
  Solution s;
  cout << s.divide(10, 3) << endl;
  cout << s.divide(7, -3) << endl;
  return 0;
}

输出:

3

-2


🌟 每日一练刷题专栏 🌟

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

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

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

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

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


目录
相关文章
|
2月前
|
编解码 算法 程序员
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南(三)
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南
27 0
|
2月前
|
C++ 索引
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南(二)
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南
31 0
|
2月前
|
存储 编译器 程序员
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南(一)
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南
50 0
|
3月前
|
算法 测试技术 C++
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
|
3月前
|
算法 测试技术 C++
【数位dp】【C++算法】600. 不含连续1的非负整数
【数位dp】【C++算法】600. 不含连续1的非负整数
|
4月前
|
Linux 监控 Shell
Linux 终端命令之文件浏览(4) head, tail
Linux 终端命令之文件浏览(4) head, tail
30 0
Linux 终端命令之文件浏览(4) head, tail
|
4月前
|
Shell Linux 机器学习/深度学习
Linux 终端操作命令(3)内部命令用法
Linux 终端操作命令(3)内部命令用法
49 0
Linux 终端操作命令(3)内部命令用法
|
4月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
63 1
Linux 终端操作命令(1)
|
4月前
|
Python Linux Ubuntu
Linux系统部署Python语言开发运行环境
Linux系统部署Python语言开发运行环境
93 0
Linux系统部署Python语言开发运行环境
|
4月前
|
Go Unix 开发者
Go语言time库,时间和日期相关的操作方法
Go语言time库,时间和日期相关的操作方法
53 0
Go语言time库,时间和日期相关的操作方法