清苑区建设网站找那家公司,品牌建设与电商发展的关系,个人网站制作dw,网站建设易客算法学习——华为机考题库2#xff08;HJ11 - HJ20#xff09;
HJ11 数字颠倒
描述
输入一个整数#xff0c;将这个整数以字符串的形式逆序输出 程序不考虑负数的情况#xff0c;若数字含有0#xff0c;则逆序形式也含有0#xff0c;如输入为100#xff0c;则输出为0…算法学习——华为机考题库2HJ11 - HJ20
HJ11 数字颠倒
描述
输入一个整数将这个整数以字符串的形式逆序输出 程序不考虑负数的情况若数字含有0则逆序形式也含有0如输入为100则输出为001
数据范围 0≤n≤2 30 −1 输入描述 输入一个int整数
输出描述 将这个整数以字符串的形式逆序输出
示例 代码解析
#include algorithm
#include iostream
#include string
using namespace std;int main() {int num;cinnum;string myStr to_string(num);reverse(myStr.begin() , myStr.end());coutmyStr;
}
// 64 位输出请用 printf(%lld)HJ12 字符串反转
描述
接受一个只包含小写字母的字符串然后输出该字符串反转后的字符串。字符串长度不超过1000
输入描述 输入一行为一个只包含小写字母的字符串。
输出描述 输出该字符串反转后的字符串。
示例 代码解析
#include algorithm
#include iostream
#include string
using namespace std;int main() {string Str;cinStr;reverse(Str.begin(), Str.end());coutStr;
}
// 64 位输出请用 printf(%lld)HJ13 句子逆序
描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”逆序排放后为“boy a am I”
所有单词之间用一个空格隔开语句中除了英文字母外不再包含其他字符
**数据范围**输入的字符串长度满足 1≤n≤1000
注意本题有多组输入 输入描述 输入一个英文语句每个单词用空格隔开。保证输入只包含空格和字母。
输出描述 得到逆序的句子
示例 代码解析
#include algorithm
#include iostream
#include string
using namespace std;int main() {string myStr;getline(cin, myStr);reverse(myStr.begin(), myStr.end());// coutmyStrendl;int left 0 , right 0;for(int right 0 ; right myStr.size() ; right){if(myStr[right] ){reverse(myStr.begin() left, myStr.begin() right);left right 1;}if(right myStr.size()-1){reverse(myStr.begin() left, myStr.begin() right 1);}}coutmyStr;
}
// 64 位输出请用 printf(%lld)HJ14 字符串排序
描述
给定 n 个字符串请对 n 个字符串按照字典序排列。
数据范围 1≤n≤1000 字符串长度满足 1≤len≤100 输入描述 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。 输出描述 数据输出n行输出结果为按照字典序排列的字符串。
示例 代码解析
#include algorithm
#include iostream
#include string
#include vector
using namespace std;static bool cmp(string s1 , string s2)
{ return s1 s2;
}int main() {int N;cinN;vectorstring myVec;string tmp;while(N--){cintmp;myVec.push_back(tmp);}sort(myVec.begin(), myVec.end(), cmp);for(int i 0 ; i myVec.size(); i){cout myVec[i]endl;}}
// 64 位输出请用 printf(%lld)HJ15 求int型正整数在内存中存储时1的个数
描述
输入一个 int 型的正整数计算出该 int 型数据在内存中存储时 1 的个数。
**数据范围**保证在 32 位整型数字范围内 输入描述 输入一个整数int类型
输出描述 这个数转换成2进制后输出1的个数
示例 代码解析
#include iostream
using namespace std;int main() {int num , result 0;cinnum;for(int i0 ; i 32 ; i){if((num0x01 ) 1 ) result;num num1;}coutresult;
}
// 64 位输出请用 printf(%lld)HJ16 购物单
描述
王强决定把年终奖用于购物他把想买的物品分为两类主件与附件附件是从属于某个主件的下表就是一些主件与附件的例子 输入描述 输入的第 1 行为两个正整数Nm用一个空格隔开
其中 N N32000 表示总钱数 m m 60 为可购买的物品的个数。
从第 2 行到第 m1 行第 j 行给出了编号为 j-1 的物品的基本数据每行有 3 个非负整数 v p q
其中 v 表示该物品的价格 v10000 p 表示该物品的重要度 1 ~ 5 q 表示该物品是主件还是附件。如果 q0 表示该物品为主件如果 q0 表示该物品为附件 q 是所属主件的编号
输出描述 输出一个正整数为张强可以获得的最大的满意度。
示例 代码解析
#includeiostream
#includevector
using namespace std;
int main(){int M,N;cinMN;M/10;vectorvectorint price(N1,vectorint(3,0));vectorvectorint value(N1,vectorint(3,0));for(int i1;iN;i){int a,b,c;cinabc;if(c0){price[i][0]a/10;value[i][0]b;}else{if(price[c][1]!0){price[c][2]a/10;value[c][2]b;}else{price[c][1]a/10;value[c][1]b;}}}vectorvectorint dp(N1,vectorint(M1,0));for(int i1;iN;i){for(int j1;jM;j){int aprice[i][0],bvalue[i][0];int cprice[i][1],dvalue[i][1];int eprice[i][2],fvalue[i][2];dp[i][j]ja?max(dp[i-1][j-a]a*b,dp[i-1][j]):dp[i-1][j];dp[i][j]jac?max(dp[i-1][j-a-c]a*bc*d,dp[i][j]):dp[i][j];dp[i][j]jae?max(dp[i-1][j-a-e]a*be*f,dp[i][j]):dp[i][j];dp[i][j]jace?max(dp[i-1][j-a-e-c]a*bc*de*f,dp[i][j]):dp[i][j];}}coutdp[N][M]*10endl;return 0;
}HJ17 坐标移动
描述
开发一个坐标计算工具 A表示向左移动D表示向右移动W表示向上移动S表示向下移动。从0,0点开始移动从输入字符串里面读取一些坐标并将最终输入结果输出到输出文件里面。
输入
合法坐标为A(或者D或者W或者S) 数字两位以内
坐标之间以;分隔。
非法坐标点需要进行丢弃。如AA10; A1A; % ; YAD; 等。
下面是一个简单的例子 如
A10;S20;W10;D30;X;A1A;B10A11;;A10;
处理过程
起点0,0 A10 -10,0 S20 (-10,-20) W10 (-10,-10) D30 (20,-10) x 无效 A1A 无效 B10A11 无效 一个空 不影响 A10 (10,-10)
结果 10 -10
数据范围 每组输入的字符串长度满足 1≤n≤10000 坐标保证满足 −2 31 ≤x,y≤2 31 −1 且数字部分仅含正数 输入描述 一行字符串
输出描述 最终坐标以逗号分隔
示例 代码
#include iostream
#include string
#include vector
using namespace std;int main() {string myStr;vectorstring date;cinmyStr;int x 0 , y 0;string tmp ;for(int i0 ; imyStr.size() ;i){if(myStr[i] ;){date.push_back(tmp);tmp.clear();}else tmp myStr[i];}char dir;int lenght 0;for(int i0 ; idate.size() ;i){dir date[i][0];if(dir A ||dir D ||dir W ||dir S){tmp date[i].substr(1,date[i].size() -1);bool flag true;for(int x0 ; xtmp.size() ; x ) {if( tmp[x] 0 tmp[x] 9) {}else{flag false;break;}}if(flag true){lenght stoi(tmp);// coutdirlenghtendl;if(dir A) x - lenght;else if(dir D) x lenght;else if(dir W) y lenght;else if(dir S) y - lenght;} }}coutx,y;
}
// 64 位输出请用 printf(%lld)HJ18 识别有效的IP地址和掩码并进行分类统计
描述
请解析IP地址和对应的掩码进行分类识别。要求按照A/B/C/D/E类地址归类不合法的地址和掩码单独归类。
所有的IP地址划分为 A,B,C,D,E五类
A类地址从1.0.0.0到126.255.255.255;
B类地址从128.0.0.0到191.255.255.255;
C类地址从192.0.0.0到223.255.255.255;
D类地址从224.0.0.0到239.255.255.255
E类地址从240.0.0.0到255.255.255.255
私网IP范围是
从10.0.0.0到10.255.255.255
从172.16.0.0到172.31.255.255
从192.168.0.0到192.168.255.255
子网掩码为二进制下前面是连续的1然后全是0。例如255.255.255.32就是一个非法的掩码 注意二进制下全是1或者全是0均为非法子网掩码
注意
类似于【0...】和【127...】的IP地址不属于上述输入的任意一类也不属于不合法ip地址计数时请忽略私有IP地址和A,B,C,D,E类地址是不冲突的
输入描述 多行字符串。每行一个IP地址和掩码用~隔开。
请参考帖子https://www.nowcoder.com/discuss/276处理循环输入的问题。 输出描述 统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数之间以空格隔开。
示例 代码解析
#includeiostream
#includestring
#includesstream
#includevector
using namespace std;bool judge_ip(string ip){int j 0;istringstream iss(ip);string seg;while(getline(iss,seg,.))if(j 4 || seg.empty() || stoi(seg) 255)return false;return j 4;
}bool is_private(string ip){istringstream iss(ip);string seg;vectorint v;while(getline(iss,seg,.)) v.push_back(stoi(seg));if(v[0] 10) return true;if(v[0] 172 (v[1] 16 v[1] 31)) return true;if(v[0] 192 v[1] 168) return true;return false;
}bool is_mask(string ip){istringstream iss(ip);string seg;unsigned b 0;while(getline(iss,seg,.)) b (b 8) stoi(seg);if(!b) return false;b ~b 1;if(b 1) return false;if((b (b-1)) 0) return true;return false;
}int main(){string input;int a 0,b 0,c 0,d 0,e 0,err 0,p 0;while(cin input){istringstream is(input);string add;vectorstring v;while(getline(is,add,~)) v.push_back(add);if(!judge_ip(v[1]) || !is_mask(v[1])) err;else{if(!judge_ip(v[0])) err;else{int first stoi(v[0].substr(0,v[0].find_first_of(.)));if(is_private(v[0])) p;if(first 0 first 127) a;else if(first 127 first 192) b;else if(first 191 first 224) c;else if(first 223 first 240) d;else if(first 239 first 256) e;}}}cout a b c d e err p endl;return 0;
}HJ19 简单错误记录
描述
开发一个简单错误记录功能小模块能够记录出错的代码所在的文件名称和行号。
处理
1、 记录最多8条错误记录循环记录最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条但是错误计数增加。最后一个斜杠后面的带后缀名的部分保留最后16位和行号完全匹配的记录才做算是“相同”的错误记录。 2、 超过16个字符的文件名称只记录文件的最后有效16个字符 3、 输入的文件可能带路径记录文件名称不能带路径。也就是说哪怕不同路径下的文件如果它们的名字的后16个字符相同也被视为相同的错误记录 4、循环记录时只以第一次出现的顺序为准后面重复的不会更新它的出现时间仍以第一次为准
**数据范围**错误记录数量满足 1≤n≤100 每条记录长度满足 1≤len≤100 输入描述 每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称行号以空格隔开。
输出描述 将所有的记录统计并将结果输出格式文件名 代码行数 数目一个空格隔开如
示例 代码解析
#include algorithm
#include deque
#include iostream
#include map
#include queue
#include string
#include vector
using namespace std;int main() {vectorpairstring , int date;string tmpName;int num;while (cin tmpName num) { dequechar tmDeq;for(int itmpName.size()-1 ; i 0 ; i--){if(tmpName[i] \\ ||tmpName.size() - i 16 ) break;tmDeq.push_front(tmpName[i]);}tmpName.assign(tmDeq.begin(), tmDeq.end());tmpName ;tmpName to_string(num) ;// couttmpName tmpNameendl;bool flag false;for(int i0 ; i date.size() ; i){if(date[i].first tmpName){date[i].second;flag true;} }if(flag false) date.push_back({tmpName , 1});}if(date.size() 8){ for(int idate.size()-8 ; idate.size() ; i)coutdate[i].first date[i].secondendl;}else {for(int i0 ; idate.size() ; i)coutdate[i].first date[i].secondendl;}date.clear();
}
// 64 位输出请用 printf(%lld)HJ20 密码验证合格程序
描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的包含公共元素的子串重复 注其他符号不含空格或换行
数据范围输入的字符串长度满足 1≤n≤100 输入描述 一组字符串。
输出描述 如果符合要求输出OK否则输出NG
示例 代码解析
#include iostream
#include string
using namespace std;string cheak(string tmp)
{int flag[4] {0,0,0,0};if(tmp.size() 8) return NG;for(int i0 ; i tmp.size() ; i){if(tmp[i] A tmp[i] Z) flag[0] 1;else if(tmp[i] a tmp[i] z) flag[1] 1;else if(tmp[i] 0 tmp[i] 9) flag[2] 1;else flag[3] 1;}int count 0;for(int i0 ; i4 ; i)if(flag[i] 1) count;if(count 3) return NG;for(int i0 ; itmp.size() ; i){for(int ji3 ; jtmp.size() ; j){if(tmp[i] tmp[j] tmp[i1] tmp[j1] tmp[i2] tmp[j2])return NG;}}return OK;
}int main() {string tmp;while (cin tmp ){cout cheak(tmp) endl;}
}
// 64 位输出请用 printf(%lld)