牛客网 1.14周赛

文章介绍了如何使用C++编程语言解决两个问题:一是处理字符串,找出所有长度为2的连续子串并按字典序排序;二是模拟砖块游戏,根据指定次数的炸弹爆炸操作绘制最终砖块矩阵。作者提到使用数组和排序算法优化解决方案,但时间复杂度较高。
摘要由CSDN通过智能技术生成

小红的字符串

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

小红拿到了一个长度为nnn的,仅包含小写字母的字符串strstrstr,请你取出所有长度恰好为 2 的连续子串,并将它们按字典序升序输出。

字典序的定义:两个字符串sss和ttt,从左到右数第一个不相同的字符,ascii 码更小的所属的字符串字典序更小。例如,"ab"的字典序小于"ca"。

输入描述


一个仅包含小写字母的字符串strstrstr。长度不超过100000100000100000

输出描述

n−1n-1n−1行字符串,代表排序后的连续子串。

示例1

输入

复制ababa

ababa

输出

复制ab ab ba ba

ab
ab
ba
ba

从c++方面考虑可以用库函数substr切割为两段两段的,然后用sort函数进行排序然后升序输出

但是c方面就用不了函数substr函数进行切割了 我从建立两个关联数组方面思考的,希望等自己以后厉害之后能够自己完善一下。

#include<stdio.h>
#include<string.h>
int main() {
    char abc[100003];
    int ab[100003];                                     建立了三个数组用于比较转化说明的
    int ac[100003];
    gets(abc);
    int i = 0;
  

 while (abc[i] != NULL) {                           将各两个字母一起转化为int类型,便于比较排序 
        ab[i] = (int)abc[i];                                
        ab[i] = ab[i] * 100 + (int)abc[i + 1];        比大小优先看首字母,所以第一个字母赋值的时候
        i++;                                                        ×了100
    }
    for (int k = 0; k < i; k++) {
        ac[k] = ab[k];
    }
    int zimugeshu = i - 1;
    

    for (int i = 0; i < zimugeshu ; i++) {                  //用气泡法对字母大小排序
        int q;
        for (int j = 0; j < zimugeshu  - i; j++) {

            if (ac[j] > ac[j + 1]) {
                q = ac[j];
                ac[j] = ac[j + 1];
                ac[j + 1] = q;
            }
            
        }
    }
    
    for (int i = 0; i <= zimugeshu; i++) {                类似于看着排好序的字母,先把小的那一组输出
        for (int k = 0; k < zimugeshu; k++) {
            if (ac[i] == ab[k]) {
               
                printf("%c%c\n", abc[k], abc[k + 1]);
                ab[k] = 0;
            }
        }
    }

    return 0;
}
 

由于最后两for循环,时间复杂度直接飙升到10的10次方。还是很恐怖的一件事的。

通过率只有0.7,不算很完美。以后学c++的时候再说吧 ,咱也没实力把substr在c里面写出来

想过直接把字符串数组转化为相应数字后在排好序后强制类型转换回来输出出来,那样就没有时间复杂度的问题了,但是vs可以这么干不知道为什么牛客网不能这么干

小红的炸砖块

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

小红正在玩一个“炸砖块”游戏,游戏的规则如下:
初始有一个n∗mn*mn∗m的砖块矩阵。小红会炸kkk次,每次会向一个位置投炸弹,如果这个位置有一个砖块,则砖块消失,上方的砖块向下落。
小红希望你画出最终砖块的图案。

输入描述:

第一行输入三个正整数n,m,kn,m,kn,m,k,代表矩阵的行数、列数和小红的炸砖块次数。
接下来的kkk行,每行输入两个正整数x,yx,yx,y,代表小红瞄准的是第xxx行第yyy列的坐标。
1≤n,m≤10001\leq n,m \leq 10001≤n,m≤1000
1≤k≤1051\leq k \leq 10^51≤k≤105
1≤x≤n1\leq x \leq n1≤x≤n
1≤y≤m1\leq y \leq m1≤y≤m

输出描述:

输出nnn行,每行输出一个长度为mmm的、仅由'.'和'*'两种字符组成的字符串。'.'代表空白,'*'代表砖块。

示例1

输入

复制3 3 4 3 1 3 3 2 3 1 3

3 3 4
3 1
3 3
2 3
1 3

输出

复制.*. **. ***

.*.
**.
***

#include<stdio.h>
int main() {
    int ab[1111][1111] = { 0 };

    int m;
    int n;
    int k;
    int x;
    int y;
    
    scanf("%d %d %d", &m, &n, &k);
    for (int i = 0; i < k; i++) {  
        int bq = 1;                                               找规律,该消失咱就让方块消失,符合的就留着
        scanf("%d %d", &x, &y);
        if (x!=1 && ab[x - 1][y] == 0) {              
            while (bq) {
                if (x == 0) {
                    ab[1][y] = 1;
                    bq = 0;
                    x+=1;
                }

                else if (x != 0 && ab[x][y] == 1) {
                    ab[x + 1][y] = 1;
                    bq = 0;
                    x+=1;
                }
                x -= 1;

            }

        }
       else {
           ab[x][y] = 1;
        }
    
    
    
    
    }
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {                               万事俱备,直接输出
            if(ab[i][j]==1)printf(".");
            else printf("*");
            
        }
        printf("\n");
    
    }

    return 0;
}

小红统计区间

#include<stdio.h>
long long int ab[100004];
long long int n;
long long int k;
long long int res = 0;
long long sum = 0;
long long abc = 0;
long long int u = 0;
int main() {
    scanf("%lld %lld", &n, &k);

    long long int i = 0;
    for (i = 0; i < n; i++) {
        scanf("%lld", &ab[i]);
    }
    while (abc != i) {
        sum += ab[abc];
        while (sum >= k) {
            
            res += i - abc;

            sum -= ab[u];
            u++;
        }
        abc++;
    }

    printf("%lld", res);
    return 0;
}
 

就跟高中数学似的,模拟排序,暴力累加就i行了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值