纪念第一次线上笔试

第一次线上笔试
第一次线上笔试,因为自学且c++年代久远,所以考试的时候第一没时间了,第二什么都忘记了,浪费了不少时间,最只做出一道题,虽然非常丢人被朋友笑菜,但毕竟是值得纪念的一次,就将还记得的三道题写在博客上(可能我现在写的代码还是错的,欢迎指正呐,比心)

在一串字符串中寻找sangfor的个数:如sahnfgifjotr中有1个sangfor,sanghouytor中有0个sangfor,每一个英文字母只属于一个sangfor,输出字符串中sangfor的数量

题目一

#include
#include
int main()
{
    string str ;

    cin>>str;
    string str1 = "sangfor";
    int j  = 0,n = 0;
    for(int i = 0;i < str.size();i++){

            if(str[i] == str1[(j + 7) % 7]){
                    if(j != 0 && (j+7 + 1)%7 == 0){
                        n++;
                    }
                j++;
            }

    }
    cout << n;



    return 0;
}

这道当时思路非常清晰,就手误将判断条件(j+7 + 1)%7 == 0 写成了str[(j+7 + 1)%7 == 0],在答案截止之前也没发现,这就体现了注释和debug的重要性了。

题目二

一共有n个橘子,a袋可装8个,b袋可装6个,袋子数量足够,将n个橘子装进两个袋子中,每个袋子都必须装满,输出n个橘子全部装入的最小袋数,若不能装满,输出-1。
这道题不难,简单在6和8都是偶数。这是我唯一做出来的一道题,写了一个很长的代码,结束之后和朋友交流被他写的六行代码无情嘲讽…这里先把我写的那种贴出来,属于一般做法:

#include 

using namespace std;

int main()
{
    int n,n1 = 0;
    cin >> n;
    if(n % 2 != 0){//奇数装不满
        cout << -1;
    }else {
        int m = n % 8;
        n= n/8;
        if(m == 0){//全部装入a袋
            cout << n;
        }else{//a袋装不完,在a袋中重新拿回来装入B袋
        for(int i = 0;i < 3&&i <= n;i++){
         if((m + i * 8) % 6 == 0){//借来i袋若能放进b袋中放满
            n -= i; n1 = (m + i * 8)/6;//更新b袋的个数和a袋的个数
         }
    }
    if(n1 != 0){
        cout << n + n1;//总袋数
    }else{//再有剩余的情况下,b袋没装,表示还有剩下的。
    cout << -1;
    }}
    }

    return 0;
}

代码非常复杂,可读性很差不说,判断镶嵌判断导致自己都会晕,而朋友的代码简洁又明了,并且出乎我的意料。

static int intoBox(int n){
		if(n == 6 || n == 8) return 1;
		if(n < 12) return -1;
		if(n % 2 != 0) return -1;
		int x = n / 8;
		if(n % 8 != 0) x++;
		return x;
	}

最初看见这几行代码的时候一愣,这是什么操作,后来发现大于12的偶数n,n%8可能是2,4,6。6的话不用往a袋中拿,直接在总袋数x+1,4的话,拿来一个a袋,分给两个b袋,总袋数x +1,余数为2时,需要拿来两个a袋,分给三个b袋,总袋数也是x + 1(这也是为什么n = 10时装不满,余数为2,但是a袋只有一个,无法分出。这是所有大于6的偶数中唯一一个装不满的。)

题目三

开启宝藏的密码,输入一串由英文字母组成的字符串,小大写均可,最早出现三次的英文字母<不区分大小写>在英文字母表中所占的位置,a为1,b为2,等等,就是开启宝藏所需的密码。
我竟然忘了字母的ASCII码是自动转换的!!这道题可能是我记错了,但按照我理解的话,真的是很简单,简单到将没时间写的我按在了耻辱架上。

#include 
#include 
using namespace std;

int main()
{
    string str ;
    cin >> str;
    char c;
    int n;
    int count[26];
    for(int i = 0;i < 26;i++){
        count[i] = 0;
    }
    for(int i = 0;i =65 && n <= 90){
            count[n - 65]++;
            if(count[n-65] == 3){
                cout << n-65+1;
                break;
            }
           }else if(n >= 97 && n <= 122){
                count[n - 97]++;
            if(count[n-97] == 3){
                cout << n-97+1;
                break;
            }
           }else{
           cout << -1;
           }
    }
}

你可能感兴趣的:(那些不堪回首的时光)