欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

【Code Pratice】—— 猜字母、次数差、交换瓶子

发布时间:2024/1/1 73 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【Code Pratice】—— 猜字母、次数差、交换瓶子 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 1 | 猜字母
    • 题目
    • 思路
    • 逻辑代码
  • 2 | 次数差
    • 题目
    • 思路
    • 逻辑代码
  • 3 | 交换瓶子
    • 题目
    • 思路
    • 逻辑代码

1 | 猜字母

题目

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

思路

题目关键点:

  • 每次删除当前字母串的奇数项
  • 重复第一步直到剩余一个字母
  • 问题就相当于怎么解决上面两点

  • 怎么确定奇数项?怎么删除?

    • 奇数项确定:if (i % 2)
    • 删除:erase()
  • 怎么重复第一步?
    每一次删除都会改变原有的字母串结构,所以如果每查找到一个就删除一个的话,就会导致下一个查找的奇数项是原来的偶数项
    比如字母串abcdef,删除第一个奇数项a后,变成了bcdef,这时候再找奇数项就找到了b,但是b本应该是本轮的第一个偶数项
    所以在第一步中应该先确定本轮的所有奇数项,然后再做删除动作

  • 根据上面两点,大概思路如下

  • 判断当前字母串长度是否为1,不是则遍历当前字母串,找出所有的奇数项下标并保存,是则返回结果
  • 根据保存的奇数项下标,删除对应字母,这里要注意,没删除一个字母,字母串的长度就会减一,所以删除的时候,下标要跟着长度变化
  • 重复以上两步
  • 逻辑代码

    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

    思路

    简化题目意思就是求一串字母中出现次数最多的字母减去出现次数最少的字母的个数
    思路如下:

  • 定义26长度的数组,代表26位字母,从头开始遍历这串字母
  • 判断当前字母是哪个,对应数组位内容加一
  • 遍历完全字母串后,对数组进行排序
  • 最高位值减去最低位值(非0)即为最后答案
  • 逻辑代码

    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
  • 重复以上步骤,直到遍历完所有瓶子
  • *需要注意:*瓶子数字从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】—— 猜字母、次数差、交换瓶子的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。