【Code Pratice】—— 猜字母、次数差、交换瓶子
文章目录
- 1 | 猜字母
- 题目
- 思路
- 逻辑代码
- 2 | 次数差
- 题目
- 思路
- 逻辑代码
- 3 | 交换瓶子
- 题目
- 思路
- 逻辑代码
1 | 猜字母
题目
把abcd…s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
思路
题目关键点:
问题就相当于怎么解决上面两点
怎么确定奇数项?怎么删除?
- 奇数项确定:if (i % 2)
- 删除:erase()
怎么重复第一步?
每一次删除都会改变原有的字母串结构,所以如果每查找到一个就删除一个的话,就会导致下一个查找的奇数项是原来的偶数项
比如字母串abcdef,删除第一个奇数项a后,变成了bcdef,这时候再找奇数项就找到了b,但是b本应该是本轮的第一个偶数项
所以在第一步中应该先确定本轮的所有奇数项,然后再做删除动作
根据上面两点,大概思路如下
逻辑代码
void GuessAlphabet(const string& i_cStr) {int inLen = i_cStr.size();if (0 == inLen){cout << "Input parameter is unvalid." << endl;return;}string AlpStr = i_cStr;for (int i = 0; i < 106; i++){AlpStr += i_cStr;}while (1 != AlpStr.size()){vector<int> tmp;for (int i = 0; i < AlpStr.size(); i++){if ((i + 1) % 2){tmp.push_back(i);}}string::iterator it;for (int i = 0; i < tmp.size(); i++){it = AlpStr.begin() + tmp[i] - i;AlpStr.erase(it);}}cout << "The Last Alphabet is [" << AlpStr << "]." << endl; }2 | 次数差
题目
x星球有26只球队,分别用 a ~ z 的26个字母代表。他们总是不停地比赛。
在某一赛段,哪个球队获胜了,就记录下代表它的字母,这样就形成一个长长的串。
国王总是询问:获胜次数最多的和获胜次数最少的有多大差距?(当然,他不关心那些一次也没获胜的,认为他们在怠工罢了)
输入格式
一个串,表示球队获胜情况(保证串的长度<1000)
abaabcaa
输出格式
要求输出一个数字,表示出现次数最多的字母比出现次数最少的字母多了多少次。
4
提示
a 出现 5 次,最多;c 出现1次,最少。
5 - 1 = 4
思路
简化题目意思就是求一串字母中出现次数最多的字母减去出现次数最少的字母的个数
思路如下:
逻辑代码
int PoorTimes(const string& i_cStr) {int res = -1;int len = i_cStr.size();if (1 >= len){return res;}string Alphabet = "abcdefghijklmnopqrstuvwxyz";vector<int> AlphabetTimes(26, 0);for (int i = 0; i < len; i++){for (int j = 0; j < 26; j++){if (Alphabet[j] == i_cStr[i]){AlphabetTimes[j]++;}}}Sort(AlphabetTimes);for (int i = 0; i < len; i++){if ((0 != AlphabetTimes[i]) && (0 == AlphabetTimes[i + 1])){res = AlphabetTimes[0] - AlphabetTimes[i];break;}}return res; }3 | 交换瓶子
题目
有N个瓶子,编号 1 ~ N,放在架子上。
比如有5个瓶子:2 1 3 5 4
要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:1 2 3 4 5
对于这么简单的情况,显然,至少需要交换2次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。
输入格式为两行:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。
输出数据为一行一个正整数:
表示至少交换多少次,才能完成排序。
例子1
输入:
5
3 1 2 5 4
输出:
3
例子2
输入:
5
5 4 3 2 1
输出:
2
思路
交换有点排序的意思,就是通过每次交换两个瓶子的位置,使得最后所有瓶子都是按照升序排列的,所以只要保证每个瓶子的数字跟所在下标对应即可
*需要注意:*瓶子数字从1开始,而数组的下标是从0开始的,所以一开始应该先把下标0的位置填充一个0,保证接下来输入的数字是从1开始存放的
逻辑代码
int ExchangeBottles(int i_uNum) {int res = -1;if (2 > i_uNum){return res;}res = 0;vector<int> Bottles;Bottles.push_back(0);for (int i = 1; i <= i_uNum; i++){cin >> Bottles[i];}for (int i = 1; i <= i_uNum; i++){if (Bottles[i] != i){for (int j = 1; j <= i_uNum; j++){if (Bottles[j] == i){int tmp = Bottles[i];Bottles[i] = Bottles[j];Bottles[j] = tmp;res++;}}}}return res; }总结
以上是生活随笔为你收集整理的【Code Pratice】—— 猜字母、次数差、交换瓶子的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: python 根据三点坐标计算夹角
- 下一篇: 评WSO2/WSF系列框架之设计