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


    题目如下

    把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
    接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
    得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
    以下程序哪项运行后不能得到正确答案?

    选项吐槽

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

    A.

    1. int a[2014];
    2. int main()
    3. {
    4. int count = 2014;
    5. for (int i = 0; i < 2014; i++)
    6. {
    7. a[i] = i + 1;
    8. }
    9. do
    10. {
    11. for (int i = 0; i <= count - 1; i += 2)
    12. a[i] = 0;
    13. count = 0;
    14. for (int j = 0; j <= 2013; j++)
    15. {
    16. if (a[j] != 0)
    17. {
    18. a[count] = a[j];
    19. a[j] = 0;
    20. count++;
    21. }
    22. }
    23. } while (count != 1);
    24. cout << char('a' + (a[0] % 19));
    25. return 0;
    26. }

    B.

    1. int main()
    2. {
    3. char a[2015];
    4. int t = 0;
    5. for (int j = 0; j < 106; j++)
    6. for (int i = 0; i < 19; i++)
    7. a[t++] = 'a' + i;
    8. a[t] = 0;
    9. int k;
    10. while (t != 1)
    11. {
    12. k = 0;
    13. for (int j = 1; j < t; j += 2)
    14. a[k++] = a[j];
    15. a[k] = '\0';
    16. t = k;
    17. }
    18. cout << a << endl;
    19. return 0;
    20. }

    C.

    1. int main()
    2. {
    3. string s = "abcdefghijklmnopqrs";
    4. string str;
    5. for (int i = 0; i < 106; i++)
    6. {
    7. str += s;
    8. }
    9. while (str.length() > 1)
    10. {
    11. for (int i = 0; i < str.length(); i++)
    12. {
    13. str.erase(i, 1);
    14. }
    15. }
    16. cout << str;
    17. return 0;
    18. }

    D.

    1. int main()
    2. {
    3. vector<char> vc1;
    4. int i;
    5. for (i = 0; i < 2014; i++)
    6. vc1.push_back('a' + (i % 19));
    7. while (vc1.size() != 1)
    8. {
    9. vector<char> vc2;
    10. for (i = 1; i < vc1.size(); i += 2)
    11. vc2.push_back(vc1[i]);
    12. vc1.assign(vc2.begin(), vc2.end());
    13. }
    14. cout << vc1[0] << endl;
    15. return 0;
    16. }

    题目解析

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

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

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

    • 我们可能需要先拼接字符串106次,得到一个长度为str.leng * 106的字符串。
    • 接着需要循环删除奇数位的字母,或者保留偶数位字母,应该都可以。
    • 通过while循环,直到剩下最后一个字符为止。

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

    1. int main()
    2. {
    3. string s = "abcdefghijklmnopqrs";
    4. string str;
    5. //将字符串s拼接106次,得到长度为2014的字符串str
    6. for (int i = 0; i < 106; i++)
    7. {
    8. str += s;
    9. }
    10. //当str.length大于1时,重复执行删除奇数位的操作
    11. while (str.length() > 1)
    12. {
    13. for (int i = 0; i < str.length(); i++)
    14. {
    15. str.erase(i, 1);
    16. }
    17. }
    18. //最终得到的字符串只包含一个字符
    19. cout << str;
    20. return 0;
    21. }

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

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

  • 相关阅读:
    Oracle修改字段长度及属性
    【Python】计算机视觉 手掌图片穴位识别
    基于Kinect 动捕XR直播解决方案 - 硬件篇
    C#——字典diction详情
    Lambda 表达式原理分析学习(2022.06.23)
    Spring Boot
    如何清理内存空间?几步操作轻松搞定!
    Pytest----当fixture重名时如何调用
    React 组件:计时器例子
    使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile (KMM) 开发
  • 原文地址:https://blog.csdn.net/CodingFire/article/details/127069822