华为机试题整理
程序员文章站
2024-03-15 17:37:30
...
1、整数反转后求和
#include <iostream>
using namespace std;
int reversenum(int x)
{
int a=0;
while (x>0) {
a=a*10+x%10;
x/=10;
}
return a;
}
int reverseAdd(int a,int b)
{
if(a<1||a>70000||b<1||b>70000){
return -1;
}
int num1=reversenum(a);
int num2=reversenum(b);
int sum=num1+num2;
return sum;
}
int main()
{
int x;
int y;
cin>>x>>y;
int sum=reverseAdd(x,y);
cout<<sum;
return 0;
}
2.深度优先遍历(DFS他娘的现在和动态规划变成热门)
#include <iostream>
#include <vector>
using namespace std;
const int inf= 0x7f7f7f7f;
//时间花费矩阵
int a[][7]={
{0},
{0, 0, 2, 10, 5, 3, -1},
{0, -1, 0, 12, -1, -1, 10},
{0, -1, -1, 0, -1, 7, -1},
{0, 2, -1, -1, 0, 2, -1},
{0, 4, -1, -1, 1, 0, -1},
{0, 3, -1, 1, 0, 2, 0}
};
int x,y;//目的地,大雾城市
int res;
int used[10];//record falg
int d[50];//记录路
int haveded[50];//走过的路
int anscost=inf;
int anspath;
/*====出发地,花费时间,路径个数=====*/
void dfs(int now,int cost,int path)
{
if(now==x){
if(cost<anscost){
anscost=cost;
for(int i=0;i<path;i++){
haveded[i]=d[i];
}
anspath=path;
}
return;
}
for(int i=1;i<=6;i++){
if(i==y){
continue;
}
if(used[i]==0&&a[now][i]>=0){
used[i]=1;
d[path]=i;
dfs(i,cost+a[now][i],path+1);
used[i]=0;
}
}
}
int main()
{
static char emp[] = "";
static char col[] = ", ";
cin>>x>>y;//出差城市,大雾城市
if (x == 5)
{
cout<<"0\n[]\n";
return 0;//出差为5的话,0不可达
}
if (y == 5)
{
cout<<"1000\n[]\n";
return 0;//大雾为5的话,1000不可达
}
d[0] = 5;
used[5] = 1;
dfs(5, 0, 1);//核心算法
char *p = emp;
if (anscost == inf)
{
printf("1000\n[]\n");
}
else
{
cout<<anscost<<"\n[";
for (int i = 0; i < anspath; i++)
{
cout<<p<<haveded[i];
p = col;
}
printf("]\n");
}
return 0;
}
3.
题目描述
请设计一个算法完成两个超长正整数的加法。
输入描述:
输入两个字符串数字
输出描述:
输出相加后的结果,string型
#include<iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string a;
string b;
cin>>a>>b;
int n1=a.size();
int n2=b.size();
string x,y;
for(int i=0;i<n1;i++){
x[i]=a[n1-1-i];
}
for(int i=0;i<n2;i++){
y[i]=b[n2-1-i];
}
if(n1<n2){
for(int i=n1;i<n2;i++){
x[i]='0';
}
}else{
for(int i=n2;i<n1;i++){
y[i]='0';
}
}
int sum[100];
int carry=0;
int n=max(n1,n2);
for(int i=0;i<n;i++){
int c=x[i]-48+y[i]-48+carry;
if(c<10){
sum[i]=c;
carry=0;
}else{
sum[i]=c-10;
carry=1;
}
}
if(carry==1){
sum[n]=1;
n=n+1;
}
// for(int j=0;j<n;j++)
// cout<<sum[n-1-j];
// cout<<endl;
string res[100];
for(int j=0;j<n;j++){
res[j]=sum[n-1-j]+'0';
}
for(int j=0;j<n;j++){
cout<<res[j];
}
cout<<endl;
return 0;
}
4.
输入描述:
输入一个字符串。
输出描述:
输出字符串中最长的数字字符串和它的长度。如果有相同长度的串,则要一块儿输出,但是长度还是一串的长度
示例1
输入
abcd12345ed125ss123058789
输出
123058789,9
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
string str;
while(cin>>str)
{
string tmp;
vector<string> arr;
for(int i=0;i<=str.length();i++)
{
if(str[i]>='0' && str[i]<='9')
{
tmp+=str[i];
}
else
{
if(tmp.length()!=0)
{
arr.push_back(tmp);
}
tmp.clear();
}
}
int max=0;
int length=0;
for(int i=0;i<arr.size();i++)
{
if(max<(arr[i]).length())
{
max=(arr[i]).length();
length=max;
}
}
for(int i=0;i<arr.size();i++)
{
if(max==(arr[i]).length())
{
cout<<arr[i]<<" ";
}
}
cout<<","<<length<<endl;
}
return 0;
}
5.计算1的的个数
int countInnums(int iNum){
int iCount=0;
iNum=abs(iNum);
while(iNum){
iCount++;
iNum=iNum&(iNum-1);
}
return iCount;
}
上一篇: java对象和类
下一篇: sql 分类统计及连接分组查询