HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序

描述

输入整型数组和排序标识,对其元素按照升序或降序进行排序

数据范围: 1≤n≤1000  ,元素大小满足 0≤val≤100000

输入描述:

第一行输入数组元素个数
第二行输入待排序的数组,每个数用空格隔开
第三行输入一个整数0或1。0代表升序排序,1代表降序排序

输出描述:

输出排好序的数字

方法一:数组法

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
//数组法
//升序排序或降序排序的函数接口
void Ascending_Descending_Sorting(int num)
{int number; //输入整数int pIntegerArray[num]; //存储整数的数组int iSortFlag; //排序标识for (int i = 0; i < num; i++){cin >> number;pIntegerArray[i] = number;}cin >> iSortFlag;//数组的元素排序(从小到大)sort(pIntegerArray, pIntegerArray + num);//排序标识为 0,顺序输出if (iSortFlag == 0){for (int i = 0; i < num; i++){cout << pIntegerArray[i] << ' ';}cout << endl;}//排序标识为 1,逆序输出else if (iSortFlag == 1){for (int i = num - 1; i >= 0; i--){cout << pIntegerArray[i] << ' ';}cout << endl;}return;
}
//主函数
int main()
{int num;while (cin >> num){Ascending_Descending_Sorting(num);}return 0;
}

方法二:向量法

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;//向量法
//升序排序或降序排序的函数接口
void Ascending_Descending_Sorting(int num)
{int number; //输入整数vector <int> vec; //存储整数的向量int iSortFlag; //排序标识:0 表示按升序,1 表示按降序for (int i = 0; i < num; i++){cin >> number;vec.push_back(number);}cin >> iSortFlag;//向量的元素排序(从小到大)sort(vec.begin(), vec.end());//排序标识为 0,顺序输出if (iSortFlag == 0){for (int i = 0; i < num; i++){cout << vec[i] << ' ';}cout << endl;}//排序标识为 1,逆序输出else if (iSortFlag == 1){for (int i = num - 1; i >= 0; i--){cout << vec[i] << ' ';}cout << endl;}return;
}
//主函数
int main()
{int num;while (cin >> num){Ascending_Descending_Sorting(num);}return 0;
}

HJ102 字符统计

描述

输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。

数据范围:字符串长度满足 1≤len(str)≤1000

输入描述:

一个只包含小写英文字母和数字的字符串。

输出描述:

一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。

方法一:map

#include<iostream>
#include<map>
#include<string>
#include<algorithm>using namespace std;int main()
{string str;map<char,int> mp;while(getline(cin,str)){    map<char,int> mp;for(int i=str.size()-1;i>=0;i--){//统计出现次数mp[str[i]]++;}string res;for(int i=str.size();i>=0;i--)//按照大小排序{for(auto x:mp)//按照ASCII码的大小遍历一遍mp{if(x.second==i){//如果有字符次数为i的则把该字符添加到res中res += x.first;}}}cout<<res<<endl;}return 0;
}

方法二:

#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<char,int> a,pair<char,int> b){if(a.second==b.second){//当出现次数相同时return a.first<b.first;//输出ASCII码较小的字符}return a.second>b.second;//输出出现次数较多的字符
}
int main(){string s;while(cin>>s){map<char,int> mp;for(int i=0;i<s.size();i++){//逐个统计字符出现次数mp[s[i]]++;}vector<pair<char,int> > v(mp.begin(),mp.end());sort(v.begin(),v.end(),cmp);//按照出现次数进行排序for(auto it:v){cout<<it.first;//按照次数大小输出}cout<<endl;}
}

方法三:哈希表统计+sort排序

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;bool cmp(const pair<char, int>& a, const pair<char, int>& b){ //重载大小比较if(a.second != b.second) //优先是个数降序return a.second > b.second;else //再是ASCⅡ升序return a.first < b.first;
}int main(){string s;while(cin >> s){unordered_map<char, int> mp;for(int i = 0; i < s.length(); i++) //哈希表统计每个字符出现的次数mp[s[i]]++;vector<pair<char, int> > record(mp.begin(), mp.end());sort(record.begin(), record.end(), cmp); //排序for(int i = 0; i < record.size(); i++) //输出cout << record[i].first; cout << endl;}return 0;
}

方法二:桶排序思想

#include<iostream>
#include<string>
#include<vector>
using namespace std;int main(){string s;while(cin >> s){vector<int> hash(123, 0); //统计字母和数字出现的次数int count = 0; //记录最高次数for(int i = 0; i < s.length(); i++){ hash[s[i]]++;count = max(count, hash[s[i]]);}while(count){ //遍历所有的次数for(int i = 0; i < 123; i++) //从ASCⅡ码低到高找符合的输出if(hash[i] == count)cout << (char)i;count--;}cout << endl;}return 0;
}

HJ103 Redraiment的走法

描述

Redraiment是走梅花桩的高手。Redraiment可以选择任意一个起点,从前到后,但只能从低处往高处的桩子走。他希望走的步数最多,你能替Redraiment研究他最多走的步数吗?

数据范围:每组数据长度满足 1≤n≤200  , 数据大小满足 1≤val≤350

输入描述:

数据共2行,第1行先输入数组的个数,第2行再输入梅花桩的高度

输出描述:

输出一个结果

方法一:暴力动态规划

#include<iostream>
#include<vector>
using namespace std;int lis(vector<int>& arr) {vector<int> dp(arr.size(), 1); //设置数组长度大小的动态规划辅助数组int max = 1;for(int i = 1; i < arr.size(); i++){for(int j = 0; j < i; j++){if(arr[i] > arr[j] && dp[i] < dp[j] + 1) {dp[i] = dp[j] + 1; //i点比j点大,理论上dp要加1//但是可能j不是所需要的最大的,因此需要dp[i] < dp[j] + 1max = max > dp[i] ? max : dp[i]; //找到最大长度}}}return max;
}int main(){int n;while(cin >> n){vector<int> arr(n);for(int i = 0; i < n; i++) //输入cin >> arr[i];cout << lis(arr) << endl; //计算最长递增子序列长度}return 0;
}

方法二:二分法动态规划

#include<iostream>
#include<vector>
using namespace std;int biSearch(int x, vector<int>& dp){  //二分查找函数int left = 0, right = dp.size(), mid;while(left <= right){mid = (right + left) / 2;if(dp[mid] >= x)right = mid - 1;elseleft = mid + 1;}return left;
}
int lis(vector<int>& arr) {vector<int> len; //设置数组长度大小的动态规划辅助数组vector<int> dp;//用于二分划分的辅助数组dp.push_back(arr[0]);len.push_back(1);for(int i = 1; i < arr.size(); i++){if(arr[i] > dp[dp.size() - 1]) { dp.push_back(arr[i]);len.push_back(dp.size());}else{int t = biSearch(arr[i], dp); //二分查找,找到第一个大于arr[i]的dp位置dp[t] = arr[i];len.push_back(t + 1);}}return dp.size();
}int main(){int n;while(cin >> n){vector<int> arr(n);for(int i = 0; i < n; i++) //输入cin >> arr[i];cout << lis(arr) << endl; //计算最长递增子序列长度}return 0;
}

HJ105 记负均正II

描述

输入 n 个整型数,统计其中的负数个数并求所有非负数的平均值,结果保留一位小数,如果没有非负数,则平均值为0

本题有多组输入数据,输入到文件末尾。

数据范围:1 ≤n≤50000  ,其中每个数都满足∣val∣≤106

输入描述:

输入任意个整数,每行输入一个。

输出描述:

输出负数个数以及所有非负数的平均值

方法一:循环输入

#include<iostream>
#include<iomanip>
using namespace std;int main(){int val;int count = 0; //统计负数个数double sum = 0; // 统计非负数和int n = 0; //统计输入的总数while(cin >> val){n++; //计算输入的总个数if(val < 0)count++; //统计负数个数else //累加非负数和sum += val;}cout << count << endl;if(count == n) //没有非负数cout << "0.0" << endl;else{cout.setf(ios::fixed); //不足位自动补齐cout << fixed << setprecision(1) << sum / (double)(n - count) << endl; //计算均值}return 0;
}

方法二:递归输入

#include<iostream>
#include<iomanip>
using namespace std;void recursion(int& num, int& count, double& sum, int& n){ //递归输入if(scanf("%d", &num) == EOF) //直到读取遇到文件结束return;n++;if(num < 0) //统计负数个数count++;else //非负数和累加sum += num;recursion(num, count, sum, n); //进入下一次读取
}int main(){int val;int count = 0; //统计负数个数double sum = 0; // 统计非负数和int n = 0; //统计输入的总数recursion(val, count, sum, n);cout << count << endl;if(count == n) //没有非负数cout << "0.0" << endl;else{cout.setf(ios::fixed); //不足位自动补齐cout << fixed << setprecision(1) << sum / (double)(n - count) << endl; //计算均值}return 0;
}

HJ106 字符逆序

描述

将一个字符串str的内容颠倒过来,并输出。

数据范围:1≤len(str)≤10000

输入描述:

输入一个字符串,可以有空格

输出描述:

输出逆序的字符串

方法一:库函数

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;int main(){string s;while(getline(cin, s)){reverse(s.begin(), s.end()); //库函数逆序cout << s << endl;}return 0;
}

方法二:双指针

#include<iostream>
#include<string>
using namespace std;int main(){string s;while(getline(cin, s)){int left = 0; // 首尾双指针int right = s.length() - 1;while(left < right) //指针中间靠swap(s[left++], s[right--]); //相互交换位置cout << s << endl;}return 0;
}

HJ107 求解立方根

描述

计算一个浮点数的立方根,不使用库函数。

保留一位小数。

数据范围:∣val∣≤20

输入描述:

待求解参数,为double类型(一个实数)

输出描述:

输出参数的立方根。保留一位小数。

方法一:二分查找

#include<iostream>
#include<iomanip>
using namespace std;double cal(double x){ //二分查找double left = min(-1.0, x); //正负数都有double right = max(1.0, x);double y;while(abs(right - left) > 0.01){ //立方根的精度值y = (left + right) / 2; //二分中值if(y * y * y > x) //比较选取二分哪一边right = y;elseleft = y;}return y;
}int main(){double val;while(cin >> val){cout << setprecision(1) << fixed << cal(val) << endl; //控制小数位输出}return 0;
}

方法二:牛顿迭代法

#include<iostream>
#include<iomanip>
using namespace std;double cal(double x){ //牛顿迭代法double y = 1;while(((y * y * y - x) >= 1e-2) || (x - y * y * y) >= 1e-2) //精度控制y = (y - y / 3 + x / (3 * y * y));return y;
}int main(){double val;while(cin >> val){cout << setprecision(1) << fixed << cal(val) << endl; //控制小数位输出}return 0;
}

HJ108 求最小公倍数

描述

正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

数据范围:1≤a,b≤100000

输入描述:

输入两个正整数A和B。

输出描述:

输出A和B的最小公倍数。

方法一:暴力法

#include<iostream>
using namespace std;int main(){int a, b;while(cin >> a >> b){for(int i = a; ; i++){ //从a开始往后找if(i % a == 0 && i % b == 0){ //直到遇到第一个两个数的公倍数cout << i << endl;break;}}}return 0;
}

方法二:最小公因数法

#include<iostream>
using namespace std;int gcd(int a, int b) { //更相减损法找最大公约数int temp = abs(a - b); //取差的绝对值 while(temp != 0){ //不断减去差的绝对值直到为0   a = b;b = temp;temp = abs(a - b);}return b;
}int main(){int a, b;while(cin >> a >> b){cout << a * b / gcd(a, b) << endl; //乘积除以最大公因数}return 0;
}

华为机考108题(c++)(101-108)相关推荐

  1. 2023华为机考刷题指南:八周机考速通车

    2023.1.13更新: 拿到了华子offer,看到这个贴子一直有人收藏,最近有空完善一下,主要是把深搜的几道题的题号添上. 华子的机考不算简单,挺难的,还是得好好准备一下,而且技术面必撕题,所以刷题 ...

  2. Python 华为机考真题【用户调度问题】分值【Q2-200】

    提示:机考笨方法也许也是好方法(本题考深度优先搜索) 前言 华为题型: (1)考试时长150分钟.三道应用编程题,生活中的问题,用程序解决. (2)前两道各100分,第三道200分. (3)前两道相对 ...

  3. 【华为机考刷题】2022_6_14

    [机考练习地址]机考练习地址(供参考): https://www.nowcoder.com/ta/huawei HJ1 字符串最后一个单词的长度 计算字符串最后一个单词的长度,单词以空格隔开,字符串长 ...

  4. 华为机考1-54题总结

    华为笔试面试机考在线练习,欢迎练习并在讨论区交流题解与想法. 华为机试 质数因子 题目描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 ...

  5. 【华为机考】专题突破 第一周:单调栈 739 、503 、901、84

    刷题顺序参考于 <2023华为机考刷题指南:八周机考速通车> 前言 单调栈:分为单调递增和单调递减栈.(栈内元素成递增或者递减性): 单调递增栈:从栈底到栈顶数据是从大到小,即 栈内的元素 ...

  6. 「解析」牛客网-华为机考企业真题 1-20

    又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...

  7. 「解析」牛客网-华为机考企业真题 41-60

    又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...

  8. 「解析」牛客网-华为机考企业真题 81-108

    又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...

  9. 「解析」牛客网-华为机考企业真题 21-40

    又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...

  10. 【华为机试真题详解】不含 101 的数【2022 Q4 | 100分】

    文章目录 前言 题目描述 输入描述 输出描述 示例 1 示例2 题目解析 参考代码 前言 <华为机试真题详解 Python实现>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果 ...

最新文章

  1. 机器人越像人越好?被机器人盯着会变『蠢』
  2. Amazing ASP.NET Core 2.0
  3. linux下 /etc/profile、~/.bash_profile ~/.profile的执行过程
  4. mysql查看执行计划_如何查看MySQL的执行计划
  5. 想学数据分析但不会Python,过来看看SQL吧(下)~
  6. 数据恢复-SQL被注入攻击程序的应对策略(ORA-16703)
  7. pku2750 Potted Flower
  8. Apple’s current market value is more than two trillion
  9. linux安装nodejs binaries包以及设置npm国内镜像
  10. 为AspxGridView绑定嵌套数据
  11. java基础学习(6)疯狂java讲义第5章课后习题解答源码
  12. TcpSocket的Qt串口实现与QtSocket接收数据不完整处理方法
  13. ajax 上传文件实例,Ajax 之文件上传
  14. 西门子S7-200smart PLC远程下载程序的方法
  15. 常用数学符号大全、关系代数符号
  16. cosmos官方nameservice测试项目详解(代码注释+官方文档错误纠正)
  17. linux限制指定ip禁止访问指定端口,linux设置iptables禁止某个IP访问
  18. 奇瑞文档云服务器地址,奇瑞文档云服务器地址是多少
  19. 大数据量、高并发量网站解决方案
  20. INFINEON(英飞凌)样片申请与经验

热门文章

  1. 方便、免费的PDF在线处理网站汇总:PDF合并、文字编辑、页面提取与删除、格式转换…
  2. 《高质量C/C++编程指南》摘要
  3. 【OpenCV】HSV颜色识别-HSV基本颜色分量范围
  4. 谈谈三次握手四次挥手
  5. 分享一个stm8s003单片机的ADC转换,附加一个冒泡算法(用于减少误差)
  6. 三极管原理--我见过最通俗讲法
  7. android java 面试题及答案_android面试题及答案
  8. 通信原理 | 波段的划分
  9. Matlab快速创建矩阵的方法(创建特殊矩阵)
  10. ubuntu安装和卸载软件命令