文章目录

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

1 | 猜字母

题目

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

思路

题目关键点:

  1. 每次删除当前字母串的奇数项
  2. 重复第一步直到剩余一个字母

问题就相当于怎么解决上面两点

  1. 怎么确定奇数项?怎么删除?

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

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

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

逻辑代码

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

思路

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

  1. 定义26长度的数组,代表26位字母,从头开始遍历这串字母
  2. 判断当前字母是哪个,对应数组位内容加一
  3. 遍历完全字母串后,对数组进行排序
  4. 最高位值减去最低位值(非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. 遍历每一个瓶子,判断当前下标和瓶子的数字是否对应
  2. 如果对应则遍历下一个
  3. 如果不对应,则寻找到当前下标对应的瓶子数字的下标,并交换位置,次数+1
  4. 重复以上步骤,直到遍历完所有瓶子

*需要注意:*瓶子数字从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】—— 猜字母、次数差、交换瓶子相关推荐

  1. 【蓝桥杯】 次数差:x 星球有 26 只球队,分别用 a ~ z 的 26 个字母代表。他们总是不停地比赛。 在某一赛段,哪个球队获胜了,就记录下代表它的字母,这样就形成一个长长的串。 国王...

    [蓝桥杯] 次数差 题目描述 解题代码 C语言 法一 法二 测试用例 题目描述 题目传送门 >> 次数差 [问题描述] x 星球有 26 只球队,分别用 a ~ z 的 26 个字母代表. ...

  2. Java算法试题--猜字母/杀人游戏

    题目例如以下: 把abcd-s共19个字母组成的序列反复拼接106次,得到长度为2014的串. 接下来删除第1个字母(即开头的字母a).以及第3个,第5个等全部奇数位置的字母. 得到的新串再进行删除奇 ...

  3. java猜字母讲解_JAVA语言中的经典案例:猜字母游戏

    设计数据结构 问题 猜字母游戏规则为,随机产生5个按照一定顺序排列的字符作为猜测的结果,由玩家来猜测此字符串,玩家可以猜测多次,每猜测一次,由系统提示结果,如果猜测的完全正确则游戏结束,计算玩家的游戏 ...

  4. java过滤器经典案例_JAVA语言基础的经典案例:猜字母游戏

    设计数据结构 问题 猜字母游戏规则为,随机产生5个按照一定顺序排列的字符作为猜测的结果,由玩家来猜测此字符串,玩家可以猜测多次,每猜测一次,由系统提示结果,如果猜测的完全正确则游戏结束,计算玩家的游戏 ...

  5. Java入门第37课——猜字母游戏之设计数据结构

    问题         有猜字母游戏,其游戏规则为:程序随机产生5个按照一定顺序排列的字符作为猜测的结果,由玩家来猜测此字符串.玩家可以猜测多次,每猜测一次,则由系统提示结果.如果猜测的完全正确,则游戏 ...

  6. 切面条/猜字母/大衍数列/奇怪的分式

    题目2.切面条 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以得到3根面条.如果连续对折2次,中间切一刀,可以得到5根面条.那么,连续对折10次,中间切一刀,会得到多少 ...

  7. 梅森素数、猜年龄、啤酒饮料、武功秘籍、调和级数、李白打酒、猜字母、扩散、三升序列、寻找2020

    梅森素数 题目 如果一个数字的所有真因子之和等于自身,则称它为"完全数"或"完美数" 例如:6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + ...

  8. C语言 | 猜字母小游戏(简单易学)

    下面是一个使用C语言编写的猜字母小游戏的示例代码: #include <stdio.h> #include <stdlib.h> #include <time.h> ...

  9. 猜字母游戏java源代码

    import java.util.Arrays; import java.util.Random; import java.util.Scanner;public class GuseeLetter ...

最新文章

  1. 图灵奖得主门徒、RISC-V 创始成员领衔,睿思芯科获数千万美金融资 | AI 创业周报第6期...
  2. hadoop之 Zookeeper 分布式应用程序协调服务
  3. 《图解HTTP》读书笔记--第3章HTTP报文内的HTTP信息
  4. Java Optional 的 orElse() 和 orElseGet() 的区别
  5. 某android平板项目开发笔记--自定义sharepreference UI
  6. 配置ssd为缓存_撕下贴牌的画皮!快速确定SSD性能等级,关键在这3步
  7. 1018 锤子剪刀布 (20分)
  8. JBoss Tools安装
  9. 黄子韬现身助力公益 百度推出听障儿童手语翻译小程序
  10. CSS3 选择器(Selector)
  11. matlab2016a 问题及解决方法记录
  12. 学python心得体会800字-python 学习心得
  13. 01.FFmpeg下载以及安装
  14. mysql高可用 MHA
  15. 我们真的需要复杂的密码吗?
  16. PLSQL - 递归子查询RSF打破CONNECT BY LOOP限制
  17. 启动报错java.net.ConnectException: [NACOS HTTP-POST] The maximum number of tolerable
  18. 如何打造以人为本的移动游戏
  19. 【English Training】Green Economy and Trade
  20. Go开发之如何破解安装GoLand编译器?

热门文章

  1. linux大文件分割 split命令
  2. java照片拍摄时间_java读取图片的(尺寸、拍摄日期、标记)等EXIF信息
  3. 如何在Windows 10上隐藏任务栏
  4. Unity UI界面设计方法
  5. 车载导航仪GPS开发基础
  6. 关于Nginx:Nginx在windows上安装及Nginx的配置和优化
  7. python爬取豆瓣排行榜电影数据(含GUI界面版)
  8. 并联串联混合的电压和电流_电流互感器知识:铭牌、接线图、重点问题详解
  9. 做副业月薪12K+,工作效率翻倍,Python是个什么宝藏?
  10. 走进FileNet CE-了解ECM(企业内容管理)