算法学习——华为机考题库5(HJ31 - HJ35)
HJ31 单词倒排
描述
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
**数据范围:**字符串长度满足 1≤n≤10000
输入描述:
输入一行,表示用来倒排的句子
输出描述:
输出句子的倒排结果
示例
代码解析
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string tmp;
vector<string> date;
while(getline(cin, tmp , ' '))
{
string mini;
mini.clear();
for(int i=0 ; i<tmp.size() ;i++)
{
if((tmp[i] >= 'a' && tmp[i] <= 'z')
||( tmp[i] >= 'A' && tmp[i] <= 'Z') )
{
mini += tmp[i];
}
else if(mini.size() > 0)
{
date.push_back(mini);
mini.clear();
}
if(i==tmp.size()-1 && mini.size() > 0) date.push_back(mini);
}
}
// date[date.size()-1].pop_back();
reverse(date.begin(), date.end());
for(auto it:date)
cout<<it<<' ';
}
// 64 位输出请用 printf("%lld")
HJ32 密码截取
描述
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
**数据范围:**字符串长度满足 1≤n≤2500
输入描述:
输入一个字符串(字符串的长度不超过2500)
输出描述:
返回有效密码串的最大长度
示例
代码解析
#include <iostream>
#include <vector>
using namespace std;
int main() {
string Str;
cin>>Str;
int result = 0;
vector<vector<bool>> dp(Str.size() , vector<bool>(Str.size(),false));
for(int i=Str.size()-1 ; i>=0 ; i--)
{
for(int j=i ; j<Str.size() ; j++)
{
if(Str[i] == Str[j] &&
( j-i<=1 || dp[i+1][j-1] == true ))
{
dp[i][j] = true;
if(j-i > result) result = j-i;
}
}
}
cout<<result+1;
}
// 64 位输出请用 printf("%lld")
HJ33 整数与IP地址间的转换
描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
**数据范围:**保证输入的是合法的 IP 序列
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
示例
代码解析
#include<iostream>
#include<sstream>
#include<regex>
#include<string>
using namespace std;
int main(){
string s;
while(cin >> s){
if(s.find_first_of('.') != string::npos){ //查找到有.的就是IP地址
long num[4];
stringstream(regex_replace(s, regex("\\."), " ")) >> num[0] >> num[1] >> num[2] >> num[3]; //用正则表达式分割后输入数组
long output = num[0] << 24 | num[1] << 16 | num[2] << 8 | num[3]; //位运算组装
cout << output << endl;
}else{ //否则是整数
long num;
stringstream(s) >> num; //流输入转数字
stringstream output;
output << ((num >> 24) & 0xff) << "." << ((num >> 16) & 0xff) << "." << ((num >> 8) & 0xff) << "." << (num & 0xff); //流输出格式
cout << output.str() << endl; //转字符串输出
}
}
return 0;
}
HJ34 图片整理
描述
Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
Lily使用的图片使用字符"A"到"Z"、“a"到"z”、"0"到"9"表示。
**数据范围:**每组输入的字符串长度满足 1≤n≤1000
输入描述:
一行,一个字符串,字符串中的每个字符表示一张Lily使用的图片。
输出描述:
Lily的所有图片按照从小到大的顺序输出
示例
代码解析
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main() {
string Str;
cin>>Str;
sort(Str.begin(), Str.end());
cout<<Str;
}
// 64 位输出请用 printf("%lld")
HJ35 蛇形矩阵
描述
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
例如,当输入5时,应该输出的三角形为:
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
输入描述:
输入正整数N(N不大于100)
输出描述:
输出一个N行的蛇形矩阵。
示例
代码解析
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N;
vector<vector<int>> date;
cin>>N;
int num = 1;
for(int i=0 ; i<N ;i++)
{
vector<int> tmp;
tmp.clear();
for(int j=0 ; j<=i ; j++)
{
tmp.push_back(num);
num++;
}
date.push_back(tmp);
}
for(int i=0 ; i <N ; i++)
{
for(int j=0 ; j<date.size() ; j++)
{
if(date[j].size() > 0)
{
cout<<date[j].back()<<' ';
date[j].pop_back();
}
}
cout<<endl;
}
}
// 64 位输出请用 printf("%lld")