丹阳网站建设价格,网站会员系统方案,做创业网站赚钱,然后在亚马逊网站上做外贸算法学习——华为机考题库10#xff08;HJ64 - HJ69#xff09;
HJ64 MP3光标位置
描述
MP3 Player因为屏幕较小#xff0c;显示歌曲列表的时候每屏只能显示几首歌曲#xff0c;用户要通过上下键才能浏览所有的歌曲。为了简化处理#xff0c;假设每屏只能显示4首歌曲HJ64 - HJ69
HJ64 MP3光标位置
描述
MP3 Player因为屏幕较小显示歌曲列表的时候每屏只能显示几首歌曲用户要通过上下键才能浏览所有的歌曲。为了简化处理假设每屏只能显示4首歌曲光标初始的位置为第1首歌。
现在要实现通过上下键控制光标移动来浏览歌曲列表控制逻辑如下
歌曲总数4的时候不需要翻页只是挪动光标位置。
光标在第一首歌曲上时按Up键光标挪到最后一首歌曲光标在最后一首歌曲时按Down键光标挪到第一首歌曲。
输入说明 1 输入歌曲数量 2 输入命令 U或者D
输出说明 1 输出当前列表 2 输出当前选中歌曲
示例 代码解析
#include iostream
using namespace std;int main() {int num;string str;cinnum;cinstr;int cur 0;int left 0,right;if(num 3) right 3;else right num-1;for(auto it:str){// coutcur left rightendl;if(it U) {cur--;cur cur%num;if(cur 0) cur num;if(num 4){if(cur left cur right ) {}else if( cur num-1 ) { left num - 1 - 3; right num - 1; }else { left-- ; right--; }}}else if(it D){cur;cur cur%num;if(cur 0) cur num;if(num 4){if(cur left cur right ) {}else if( cur 0 ) { left 0; right 3; }else { left ; right; }}} }for(int ileft ; iright ; i){couti1 ;}coutendl;coutcur1;}
// 64 位输出请用 printf(%lld)HJ65 查找两个字符串a,b中的最长公共子串
描述
查找两个字符串a,b中的最长公共子串。若有多个输出在较短串中最先出现的那个。 注子串的定义将一个字符串删去前缀和后缀也可以不删形成的字符串。请和“子序列”的概念分开
数据范围字符串长度 1≤length≤300 进阶时间复杂度O(n 3) 空间复杂度O(n) 输入描述 输入两个字符串
输出描述 返回重复出现的字符
示例 代码解析
#include iostream
#include string
#include vector
using namespace std;int main() {string str1,str2;cinstr1str2;if(str1.size() str2.size()){string tmp str1;str1 str2;str2 tmp;}int m str1.size() , n str2.size();vectorvectorint dp(m1,vectorint(n1,0));int indnx , lenght 0;for(int i1 ; im ;i){for(int j1 ; jn ;j){if(str1[i-1] str2[j-1]) dp[i][j] dp[i-1][j-1] 1;if(dp[i][j] lenght){lenght dp[i][j];indnx i;}}}// for(int i0 ; im ;i)// {// for(int j0 ; jn ;j)// {// coutdp[i][j] ;// }// coutendl;// }string result(str1.begin()indnx-lenght , str1.begin() indnx);coutresult;}
// 64 位输出请用 printf(%lld)HJ66 配置文件恢复
描述
有6条配置命令它们执行的结果分别是 注意he he不是命令。
为了简化输入方便用户以“最短唯一匹配原则”匹配注需从首字母开始进行匹配
1、若只输入一字串则只匹配一个关键字的命令行。例如输入r根据该规则匹配命令reset执行结果为reset what输入res根据该规则匹配命令reset执行结果为reset what 2、若只输入一字串但匹配命令有两个关键字则匹配失败。例如输入reb可以找到命令reboot backpalne但是该命令有两个关键词所有匹配失败执行结果为unknown command
3、若输入两字串则先匹配第一关键字如果有匹配继续匹配第二关键字如果仍不唯一匹配失败。 例如输入r b找到匹配命令reset board 和 reboot backplane执行结果为unknown command。 例如输入b a无法确定是命令board add还是backplane abort匹配失败。 4、若输入两字串则先匹配第一关键字如果有匹配继续匹配第二关键字如果唯一匹配成功。例如输入bo a确定是命令board add匹配成功。 5、若输入两字串第一关键字匹配成功则匹配第二关键字若无匹配失败。例如输入b addr无法匹配到相应的命令所以执行结果为unknow command。 6、若匹配失败打印“unknown command”
注意有多组输入。 数据范围数据组数1≤t≤800 字符串长度1≤s≤20 进阶时间复杂度O(n) 空间复杂度O(n) 输入描述 多行字符串每行字符串一条命令
输出描述 执行结果每条命令输出一行
示例 代码解析
#include iostream
#include sstream
#include string
#include vector
using namespace std;vectorpairstring, string instr { {reset,},{reset,board},{board,add},{board,delete},{reboot,backplane},{backplane,abort}}; //存放每一对关键字vectorstring outstr { reset what,board fault,where to add,no board at all,impossible,install first}; //存放每条命令对应执行结果int main() {string str;while ( getline(cin,str) ) { // 注意 while 处理多个 casestringstream ss(str);string key;vectorstring date;while( getline(ss, key, ) ){date.push_back(key);}int count 0;string result;for(int i0 ; iinstr.size() ; i){int i1 instr[i].first.find(date[0]);int i2;if(date.size() 2 ){i2 instr[i].second.find(date[1]);}else if( date.size() 1 instr[i].second.empty() 1){i2 0;}else i2 -1;if( i1 0 i2 0 ){count;result outstr[ i ];}}if(count 1) coutresultendl;else coutunknown commandendl;str.clear();date.clear();}
}
// 64 位输出请用 printf(%lld)HJ67 24点游戏算法
描述
给出4个1-10的数字通过加减乘除运算得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求但每个数字仅允许使用一次且需考虑括号运算 此题允许数字重复如3 3 4 4为合法输入此输入一共有两个3但是每个数字只允许使用一次则运算过程中两个3都被选取并进行对应的计算操作。 输入描述 读入4个[1,10]的整数数字允许重复测试用例保证无异常数字。
输出描述 对于每组案例输出一行表示能否得到24点能输出true不能输出false
示例 代码示例
#include iostream
#include vectorusing namespace std;bool flag false;
void track(vectordouble date ,vectorbool path , int indnx , double result)
{if( indnx 4 || flag true ) return;//coutindnx resultendl;if( result 24 ){flag true;return;}for(int i0 ; idate.size() ;i){if(path[i] false){path[i] true;track(date, path, indnx 1 , result date[i]);track(date, path, indnx 1 , result - date[i]);track(date, path, indnx 1 , result * date[i]);track(date, path, indnx 1 , result / date[i]);path[i] false;}}}int main() {int tmp;vectordouble date;while (cin tmp) { // 注意 while 处理多个 casedate.push_back(tmp);}vectorbool path(date.size(),false);track(date,path,0,0);if(flag true) couttrueendl;else coutfalseendl;}
// 64 位输出请用 printf(%lld)HJ68 成绩排序
描述
给定一些同学的信息名字成绩序列请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
例示 jack 70 peter 96 Tom 70 smith 67
从高到低 成绩 peter 96 jack 70 Tom 70 smith 67
从低到高
smith 67
jack 70
Tom 70 peter 96
注0代表从高到低1代表从低到高
**数据范围**人数1≤n≤200 进阶时间复杂度O(nlogn) 空间复杂度O(n) 输入描述 第一行输入要排序的人的个数n第二行输入一个整数表示排序的方式之后n行分别输入他们的名字和成绩以一个空格隔开
输出描述 按照指定方式输出名字和成绩名字和成绩之间以一个空格隔开
示例 代码解析
#include iostream
#include utility
#include vector
#include string
#include algorithmusing namespace std;static bool cmp1( pairstring,int a, pairstring,int b )
{return a.second b.second;
}static bool cmp2( pairstring,int a, pairstring,int b )
{return a.second b.second;
}int main() {int n;int flag;vectorpairstring,int date;cinn;cinflag;string name;int num;while (n--) { // 注意 while 处理多个 casecinnamenum;pairstring, int tmp;tmp.first name;tmp.second num;date.push_back( tmp );}if(flag 0) stable_sort(date.begin(), date.end() , cmp1);else stable_sort(date.begin(), date.end() , cmp2);for(int i0 ; idate.size() ;i)coutdate[i].first date[i].secondendl;return 0;
}
// 64 位输出请用 printf(%lld)HJ69 矩阵乘法
描述
如果A是个x行y列的矩阵B是个y行z列的矩阵把A和B相乘其结果将是另一个x行z列的矩阵C。这个矩阵的每个元素是由下面的公式决定的 矩阵的大小不超过100*100 输入描述 第一行包含一个正整数x代表第一个矩阵的行数 第二行包含一个正整数y代表第一个矩阵的列数和第二个矩阵的行数 第三行包含一个正整数z代表第二个矩阵的列数 之后x行每行y个整数代表第一个矩阵的值 之后y行每行z个整数代表第二个矩阵的值
输出描述 对于每组输入数据输出x行每行z个整数代表两个矩阵相乘的结果
示例 代码解析
#include iostream
#include vectorusing namespace std;int main() {int x1,x2,y1,y2;cinx1x2y2;y1 x2;vectorvectorint date1(x1,vectorint(y1,0));vectorvectorint date2(x2,vectorint(y2,0));vectorvectorint result(x1,vectorint(y2,0));int tmp;for(int i0 ; i x1 ; i){for(int j0 ; j y1 ; j){cintmp;date1[i][j] tmp;}}for(int i0 ; i x2 ; i){for(int j0 ; j y2 ; j){cintmp;date2[i][j] tmp;}}for(int i0 ; i x1 ; i){for(int j0 ; j y2 ; j){tmp 0;for(int k0 ; k y1 ; k){result[i][j] (date1[i][k] * date2[k][j]);}coutresult[i][j] ;}coutendl;}}
// 64 位输出请用 printf(%lld)