题目如下
把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次,删除奇数位,如此循环往复,直到剩下一个字符为止!
本来题目就很简单,这样解释就清晰明了了。
我们来思考一下代码该怎么写:
现在,逻辑已经很明显了。我们来尝试下写代码:
- 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还是一样的。一道题目,如果思路都错了,那答案怎么可能对呢?
题目不难,有些基础基本上都能做对,不知道你有没有找出那个错误的答案呢?