菜鸟签到题 牛客算法基础训练营第一日有感

王小波曾说:“活下去的诀窍是:保持愚蠢,又不能知道自己有多蠢。”

        说实话,我没想到字符串有这么多考法,今天一开始卡在不能流去空格,又没脸问,正好妈妈约我逛街,嘿嘿嘿,丧失信心了一会,然后后来捡起来还是ac不了。

        我就想,这么多大佬的代码,可是没有一篇是适合于我这种偏文科的代码小白看的,还不是你自己没有耐心,呸! 就想在博客记录自己愚蠢的一面。 

        如果有哪里不对或者可以更改的地方,欢迎下方评论!菜鸟不怕丢脸,就怕错误没人指出,更好的方法我不知道。感谢各位大佬们了,提前拜个早年!

 牛客两道签到题如下:

链接:https://ac.nowcoder.com/acm/contest/9981/F
来源:牛客网

F 对答案一时爽
 

题目描述

考试结束了,牛牛和牛妹开始对答案。

每道题有 ABCD 四个选项,一共有道题,全部是单选题,每道题正确得 1 分,错误不得分。

牛牛和牛妹互相知道了他们每道题选择的选项。他们想知道,两个人得分之和有可能达到的最大值和最小值是多少?

输入描述:

第一行输入一个正整数(1≤n≤1001 \leq n \leq 1001≤n≤100)

第二行输入一行个字符('A'、'B'、'C'、'D'中的一种),用空格隔开。第个字符代表牛牛第题的选项。

第三行输入一行个字符('A'、'B'、'C'、'D'中的一种),用空格隔开。第个字符代表牛妹第题的选项。

输出描述:

牛牛和牛妹得分之和的能达到的最大值和最小值。用空格隔开。

示例1

输入

1
B
A

输出

1 0

说明

若正确答案为 A,那么牛牛分数是 0,牛妹分数是 1,得分之和为 0+1=1。

若正确答案为 B,那么牛牛分数是 1,牛妹分数是 0,得分之和为 1+0=1。

若正确答案为 C,那么牛牛分数是 0,牛妹分数是 0,得分之和为 0+0=0。

若正确答案为 D,那么牛牛分数是 0,牛妹分数是 0,得分之和为 0+0=0。

所以他们得分之和的最大值是 1 ,最小值是 0

示例2

输入

3
C A C
B D B

输出

3 0

题解代码如下:

#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
int n;
int main() {
    int i, j;
    string a, b;//我一开始定义的字符数组,一直在搜索怎么流去空格,结果我的错误代码一直是无法存储第一个字符,卡了很久。
    cin >> n;
    cin.get();//这个大概就是分开每个字符。

    getline(cin, a, '\n');//在比赛期间看见有大佬建议这个,但我不会用,一会会在后面总结知识点。
    getline(cin, b, '\n');
    a.erase(remove_if(a.begin(), a.end(), ::isspace), a.end());//这个应该是流去空格的一种方法。
    b.erase(remove_if(b.begin(), b.end(), ::isspace), b.end());
    int cnt = 0;
    for (i = 0; i < n; i++)if (a[i] == b[i])cnt++;
    cout << n + cnt << " " << 0;

}

知识点总结一:cin.get()

因为cin是不将“\n”作为字符串内容作为存储的,所以我们使用cin.get()。其作用为在输入流队列中保留回车。

详细情况如下(选自博客:https://blog.csdn.net/dongtingzhizi/article/details/2299358

该函数有三种格式:无参,一参数,二参数
即cin.get(),  cin.get(char ch),  cin.get(array_name, Arsize)
 
读取字符的情况:
输入结束条件:Enter键
对结束符处理:不丢弃缓冲区中的Enter
cin.get() 与 cin.get(char ch)用于读取字符,他们的使用是相似的,
即:ch=cin.get() 与 cin.get(ch)是等价的。

找了一些话,关于我以前的代码为什么无法正常存储第一个字符以及后缀许多“烫”乱码。

与scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区
一次输入过程是这样的:
当一次键盘输入结束时会将输入的数据存入输入缓冲区,
cin函数直接从输入缓冲区中取数据
正因为cin函数是直接从缓冲区取数据的,
所以有时候当缓冲区中有残留数据时,
cin函数会直接取得这些残留数据而不会请求键盘输入,
这就是例子中为什么会出现输入语句失效的原因!

知识点总结二:getline函数的使用(也选自上文链接博客,原博客有样例,欢迎观看)

cin.getline() 与 cin.get(array_name, Arsize)的读取方式相似,
以Enter结束,可以接受空格字符。
按照长度(Arsize)读取字符, 会丢弃最后的Enter字符。
但是这两个函数是有区别的:
cin.get(array_name, Arsize)当输入的字符串超长时,不会引起cin函数的错误,
后面的cin操作会继续执行,只是直接从缓冲区中取数据。
但是cin.getline()当输入超长时,会引起cin函数的错误,
后面的cin操作将不再执行。(具体原因将在下一部分"cin的错误处理"中详细介绍)
 

getline(cin,array_name,'\n')即输入方式,数组名字,结束标志。

知识点总结三:删除元素方法&stl

(1)remove() & remove_if()

remove原型:

template< class ForwardIt, class T >
ForwardIt remove(ForwardIt first, ForwardIt last, const T& value)
{
    first = std::find(first, last, value);
    if (first != last)
        for(ForwardIt i = first; ++i != last; )
            if (!(*i == value))
                *first++ = std::move(*i);
    return first;
}

remove_if原型:

remove_if(beg, end, op);

// Example
bool IsSpace(char x) { return x == ' '; }

string str2 = "Text with some  spaces";
// 处理前:"Text with some  spaces"	
str2.erase(remove_if(str2.begin(),  str2.end(), IsSpace), str2.end()); 
// 处理后:"Textwithsomespaces"

前两个并不是真的删除,要想真正删除了应该选取erase函数

(2)erase()或者resize()

string str1 = "Text with some   spaces";

str1.erase(
	std::remove(str1.begin(), str1.end(), ' '),  	//返回把空格移到后面的第一个迭代器
	str1.end()		//删除两个迭代器之间的空格
);  // ,结果:"Textwithsomespaces"

综上所述我的理解是:先用cin.get()防止“\n”流失作为后面getline判断字符串结束的标志。便于用cin输入简单的把两个字符串区分(因为直接char字符数组然后用cin只会读取一个字符)

然后又是erase加上remove_if我想的可能是用后者把空格挑出来??然后用erase删掉空格便于后期对比字符串中不同字符个数。

B 括号

链接:https://ac.nowcoder.com/acm/contest/9981/B
来源:牛客网
 

题目描述

请你构造一个非空的括号字符串,包含正好 k 个不同合法括号对。

所谓括号字符串,是指由'('和')'这两种字符构成的字符串。

要求构造的字符串长度不超过100000。

输入描述:

一个整数 k。(0<k<1e9)

输出描述:

一个仅包含左右括号字符串,其中有 k 个合法的括号对。如果有多种构造方法,输出任意一种合法方案即可。

示例1

输入

3

输出

()()

说明

 

假设字符串数组下标从 1 开始,则 (1,2), (1,4), (3,4) 共计 3 个合法括号对

当然,"()))" 也是一种合法的构造

示例2

输入

4

输出

(())

说明

 

假设字符串数组下标从 1 开始,则 (1,3), (1,4), (2,3), (2,4) 共计 4 个合法括号对

另外,合法的构造还有"())()"、"()(()(" 等等。。

示例3

输入

9

输出

()))))))))

说明

合法的还可以是:

())())()

((()))

)()()())(

等等等。。有非常多种合法构造,输出任意即可。

解题思路:

找出k的因子并且选出差最小的一对。

如平方数

4(());

9((()));

16(((())));

...

如非质数

24

(((())))))(4×6)

56

((((((())))))))(7×8)

质数则需要特别处理

7=4+3;

(())()

作者:神崎兰子
链接:https://ac.nowcoder.com/discuss/593200
来源:牛客网

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,i;
    cin>>n;
    if (n == 0) {
        cout << ")(" << endl;
    }
    else {
        int p=sqrt(n);
        int c=n/p,y=n%p;
        for(i=0;i<y;i++)printf("(");
        printf(")");
        for(;i<p;i++)printf("(");
        for(i=0;i<c;i++)printf(")");
    }
}

则我们需要两个式子来求最接近的两个因子:先将k开方,然后借助n/p和n%p求出两个因子即可;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值