第一题 (仅供参考)
1、解题思路以及测试用例
1.分解每个整数的各位数字,并且求和,加入vector中
2.对vector进行排序,最终打印结果
*/
#include<iostream>
#include<math.h>
#include<vector>
#include<algorithm>
using namespace std;int main()
{int temp;vector <int> vec;while(true){int result = 0;cin>>temp;temp = abs(temp); // 防止是负数的情况 if(temp == 0) // 0则停止输入 break;while(temp != 0) //获取当前输入整数各位数字的和 {result += temp % 10;temp = temp / 10;}vec.push_back(result); // 加入动态数组 }sort(vec.begin(), vec.end()); // 对vector动态数组排序vector <int>::iterator t; // 遍历顺序容器 for(t = vec.begin(); t != vec.end(); t++) // vec.end()是指向最后一个元素的下一个 if(t == vec.end() - 1) // 若为之后一个元素,则只输出最后一个元素的值 cout<<*t<<endl;elsecout<<*t<<" ";return 0;
}
第二题 获取马鞍点(仅供参考)
1、解题思路以及测试用例
1.获取矩阵中,在行中为最小值,在对应列中为最大值的行、列表,以及元素值
#include<iostream>
using namespace std;
int main()
{int row, col;cin>>row>>col;// 创建动态二维数组,一维动态数组 int *row_min = new int[row]; // 记录每行的最小值int *col_max = new int[col]; // 记录每列的最小值int **data = new int*[row];for(int i = 0; i < row; i++)data[i] = new int[col];// 输入矩阵的值for(int i=0; i<row;i++)for(int j=0;j<col; j++)cin>>data[i][j]; // 获取行最小值for (int i = 0; i < row; i++){int temp = data[i][0];for(int j=1; j<col;j++){if (data[i][j] < temp)temp = data[i][j]; }row_min[i] = temp;}// 获取列最大值 for (int i = 0; i < col; i++){int temp = data[0][i];for(int j=1; j<row;j++){if (data[j][i] > temp)temp = data[j][i];}col_max[i] = temp;}// 获取马鞍点 bool flag = false; // 标记是否有马鞍点 for(int i=0; i < row;i++){for(int j=0;j < col;j++){if (row_min[i] == col_max[j]){cout<<i<<" "<<j<<" "<<row_min[i]<<endl;flag = true; }} } if(flag == false)cout<<"no"<<endl;return 0;
}
第三题 (仅供参考)
1、解题思路以及测试用例
将一串字符串进行解码,字母后面出现的数字表示,该字母重复出现的次数
input:a5b3aba13b4
output:aaaaabbbabaaaaaaaaaaaaabbbb
#include<iostream>#include<string>using namespace std;
int main()
{string str, de_str;cin>>str;bool flag = false; int num = 0; // 记录重复次数 for(int i = 0; i < str.size(); i++){if (str[i]>='0' and str[i] <= '9'){num = num * 10 + int(str[i]) - 48; // 获取字符串中连续出现数字的方法很好 flag = true; }else // 当前表达式为非数字时 {if(flag == true) // 该字母前面是数字,则先重复num-1次 {de_str.append(num-1, de_str[de_str.size()-1]);flag = false;num = 0;} de_str += str[i];}}if(flag==true) // 该表达式以数字结束 de_str.append(num-1, de_str[de_str.size()-1]);cout<<de_str<<endl;return 0;
}
第四题 构建哈弗曼树,并且求带权路径长度(仅供参考)
1、解题思路以及测试用例
构建哈弗曼树,并且求带权路径长度
1.通过小根堆,可以O(logn)获取最小的元素
2.通过累加计算带权路径长度result+=min_1+min_2
#include<stdio.h>
#include <queue>using namespace std;
int main()
{//priority_queue <int> q;//从大到小输出(大根堆)priority_queue <int, vector<int>, greater<int> > q; //小根堆int n;while(scanf("%d", &n) != EOF) //一组测试数据{int temp,result = 0;//将队列置空,下次还会重复使用队列while(q.empty() == false)q.pop();for(int i = 0; i < n; i++) //初始化权值{scanf("%d", &temp);q.push(temp);}while(q.size() > 1) //若队列中元素只有1个,则为根节点{int a = q.top(); // 获取队列中的最小数据q.pop();int b = q.top();q.pop();result += a + b; //这句话超级不好理解,一定要注意q.push(a + b);}printf("%d\n", result);}return 0;
}