C++手撕 ACM——换座位-桌椅高度(取模运算)

      大三寒假要结束了,继续备战秋招,年前刷了些双指针、数组、链表的简单LeetCode题,都没有做笔记,现在也忘得差不多了,计划写一份专栏记录刷题的过程,复盘算法中的细节,由易到难,先刷简单题,再斩中等题!  


         一转眼就到4月份了,投递了好多暑期实习,4月份笔面试就会陆续开启,距离秋招也越来越近,这段时间在刷LeetCode Hot 100,每天刷个两道mid题,同时作个笔记,作为复盘,也作为到时笔面试前的复习资料,最近还发现有些笔试中的编程题或者面试中的手撕算法是ACM模式的,即代码中需要包含输入和输出的操作者,所以也借一个大厂的笔试真题练习以下这种模式下的刷题

目录

一、关键思路:取模     

二、取模法优点

三、例题训练

3.1 班级换座位-桌子高度调整

       ---->多少同学需要重新调整桌子高度


一、关键思路:取模     

        取模法是指将一个数除以另一个数,得到的余数作为结果的一种计算方法。在计算机科学中,通常使用取模运算符(%)来实现取模运算。

        取模法有很多应用,其中一个常见的应用是将一个数映射到一定范围内。例如,将一个数映射到 [0, n-1] 的范围内,可以使用该数对 n 取模得到。

二、取模法优点

        取模法的优点包括:

  1. 取模运算比除法运算更快速。在计算机底层,取模运算是通过位运算实现的,而除法运算通常需要进行多次减法运算,因此取模运算的效率更高。

  2. 取模法可以将一个数映射到一定范围内。例如,在哈希表中,可以使用取模法将键值映射到一个固定的桶中,从而实现快速的查找和插入操作。

  3. 取模法可以防止数据溢出。例如,在计算一个很大的数的阶乘时,可以使用取模法防止计算结果超出计算机能够表示的范围。

  4. 取模法可以保证整除性质。例如,判断一个数是否为偶数时,可以将该数对 2 取模,如果结果为 0,则该数为偶数;否则为奇数。

        总之,取模法是一种常见的计算方法,具有多种应用场景,并且具有快速、映射、防溢出、整除等优点。

三、例题训练

3.1 班级换座位-桌子高度调整

       ---->多少同学需要重新调整桌子高度

        小团班级的座位排成了n行(行从1到n编号),共有 m个大列(大列从1到m编号),每个大列中有a个小列(小列从1到a编号),大列与大列之间有一个过道。小团的班级每周会换一次座位,首先所有同学都换到后一行,最后一行的同学换到第一行,然后所有同学都移动到自巴右边的那个大列的相同小列上,在最右大列的同学移动到最左大列。换句话说,对于坐在第i<n行的同学,新位置在第 i+1 行,如果i=n,那么新位置在第一行,对于坐在第j<m 大列的同学,新位置在第j+1大列,如果j=m,那么新位置在第一大列;对于坐在第k小列的同学,新位置仍然在第k 小列。小团的学校最近换了一批学生桌椅。这批学生桌椅的优点在于可以调节桌子的高度,一些同学调整了桌了高度,但是另一些没有。这样换座就变得麻烦了起来,如果一位调整了桌子高度的同学换到了未调整桌子高度同学的位置,他就会调整新位置的桌子到他想要的高度,而一位没有调整桌子高度的同学换到了调整过桌子高度同学的位置,他也会调整新位置的桌子高度,便其恢复原高度。

        现在小团的班级要进行换座位了,给出换座位前班级所有桌子的情况,小团想知道,换一次位置后,有多少同学需要重新调整桌子高度。

        请编写一段包含输入和输出C语言代码 :

输入描述为:输入第一行包含三个数n,m,a,意义如题所示,

                      接下来n行,每行m个长度为a的01字符串,表示目前小团班上的桌子情况,其中0表示这个位置未调节桌子高度,1表示已调桌子高度;对于全部数据:1<=n,m<=200,n*m>=2,1<=a<=5

输出描述为:输出一行整数,表示换座位后有多少同学需要重新调整桌子高度


示例 1:

输入: 3 3 1

         1 0 1

         1 1 1

         1 0 0

输出: 6


  • 实现思路:
  1. 读入班级的桌子情况,存储在一个二维字符串数组中;

  2. 定义一个计数器cnt,用于记录需要重新调整桌子高度的人数;

  3. 对于每个位置,依次执行以下操作:(取模运算)

  • 找到该位置对应的新位置;
  • 比较当前位置和新位置的桌子情况,如果不同则cnt加1;

       4. 输出cnt的值,表示需要重新调整桌子高度的人数。

  • C++代码实现:
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m, a;
    cin >> n >> m >> a;

    vector<vector<string>> desks(n, vector<string>(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> desks[i][j];
        }
    }

    int cnt = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int next_row = (i + 1) % n;
            int next_col = (j + 1) % m;
            // 比较当前位置和新位置的桌子情况
            for (int k = 0; k < a; k++) {
                if (desks[i][j][k] != desks[next_row][next_col][k]) {
                    cnt++;
                }
            }
        }
    }

    cout << cnt << endl;

    return 0;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值