蓝桥杯练习题十三 - 猜字母(c++)

简介: 蓝桥杯练习题十三 - 猜字母(c++)

题目如下


把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。

接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。

得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。

以下程序哪项运行后不能得到正确答案?


选项吐槽


这类选择题一直是我不喜欢的类型,因为,要想写一种正确的解法很容易,难的是写出多种不同的解法,题目中给出了四个选项,虽然我最选择对了,但所花的时间成本却很高,现先把题目给出的选项列出如下:


A.

int a[2014];
int main()
{
    int count = 2014;
    for (int i = 0; i < 2014; i++)
    {
        a[i] = i + 1;
    }
    do
    {
        for (int i = 0; i <= count - 1; i += 2)
            a[i] = 0;
        count = 0;
        for (int j = 0; j <= 2013; j++)
        {
            if (a[j] != 0)
            {
                a[count] = a[j];
                a[j] = 0;
                count++;
            }
        }
    } while (count != 1);
    cout << char('a' + (a[0] % 19));
    return 0;
}

B.

int main()
{
    char a[2015];
    int t = 0;
    for (int j = 0; j < 106; j++)
        for (int i = 0; i < 19; i++)
            a[t++] = 'a' + i;
    a[t] = 0;
    int k;
    while (t != 1)
    {
        k = 0;
        for (int j = 1; j < t; j += 2)
            a[k++] = a[j];
        a[k] = '\0';
        t = k;
    }
    cout << a << endl;
    return 0;
}

C.

int main()
{
    string s = "abcdefghijklmnopqrs";
    string str;
    for (int i = 0; i < 106; i++)
    {
        str += s;
    }
    while (str.length() > 1)
    {
        for (int i = 0; i < str.length(); i++)
        {
            str.erase(i, 1);
        }
    }
    cout << str;
    return 0;
}

D.

int main()
{
    vector<char> vc1;
    int i;
    for (i = 0; i < 2014; i++)
        vc1.push_back('a' + (i % 19));
    while (vc1.size() != 1)
    {
        vector<char> vc2;
        for (i = 1; i < vc1.size(); i += 2)
            vc2.push_back(vc1[i]);
        vc1.assign(vc2.begin(), vc2.end());
    }
    cout << vc1[0] << endl;
    return 0;
}

题目解析


一个字符串拼接106次,删除奇数位,如此循环往复,直到剩下一个字符为止!


本来题目就很简单,这样解释就清晰明了了。


我们来思考一下代码该怎么写:


我们可能需要先拼接字符串106次,得到一个长度为str.leng * 106的字符串。

接着需要循环删除奇数位的字母,或者保留偶数位字母,应该都可以。

通过while循环,直到剩下最后一个字符为止。

现在,逻辑已经很明显了。我们来尝试下写代码:

int main()
{
    string s = "abcdefghijklmnopqrs";
    string str;
    //将字符串s拼接106次,得到长度为2014的字符串str
    for (int i = 0; i < 106; i++)
    {
        str += s;
    }
    //当str.length大于1时,重复执行删除奇数位的操作
    while (str.length() > 1)
    {
        for (int i = 0; i < str.length(); i++)
        {
            str.erase(i, 1);
        }
    }
    //最终得到的字符串只包含一个字符
    cout << str;
    return 0;
}

选项B,C恰好是按照这种方式来做,只有A和D貌似有点怪异,但是细看会发现D里面vc1.push_back('a' + (i % 19));问题就在这个%19上,这样就保证了字母是不会累加到z上去,最终的结果和BC还是一样的。一道题目,如果思路都错了,那答案怎么可能对呢?


题目不难,有些基础基本上都能做对,不知道你有没有找出那个错误的答案呢?

目录
相关文章
|
1月前
|
算法 C++
小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题
|
1月前
|
网络安全
蓝桥杯-网络安全-练习题-crypto-rsa
蓝桥杯-网络安全-练习题-crypto-rsa
蓝桥杯-网络安全-练习题-crypto-rsa
|
1月前
|
算法 测试技术 C++
小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题
|
1月前
|
算法 C++ 数据格式
小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题
|
1月前
|
算法 C++
小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题
|
1月前
|
C语言
蓝桥杯练习题
蓝桥杯练习题包括6道C语言编程题:1. 判断三位数是否为水仙花数;2. 输出区间质因数分解;3. 将秒转换为&#39;H:M:S&#39;格式;4. 判断闰年;5. 删除可被整除元素并排序数组,数字转字母;6. 分类比较两个字符串关系。每题涉及不同逻辑操作,适合编程初学者练习。
26 3
|
1月前
|
人工智能 搜索推荐 C++
小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题
小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题
|
1月前
|
机器学习/深度学习 存储 人工智能
小唐开始刷蓝桥(三)2018年第九届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(三)2018年第九届C/C++ B组蓝桥杯省赛真题
|
1月前
|
存储 人工智能 算法
小唐开始刷蓝桥(四)2017年第八届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(四)2017年第八届C/C++ B组蓝桥杯省赛真题
|
1月前
|
存储 人工智能 Java
小唐开始刷蓝桥(二)2019年第十届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(二)2019年第十届C/C++ B组蓝桥杯省赛真题