闲着无聊,刷了几题华为机试题,适应下。
1 最小长方形
描述:
给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内。长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内。
运行时间限制: 10 Sec
内存限制: 128 MByte
输入:
测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标(x y) 占一行,其中|x|和|y|小于 1000;一对(0,0) 坐标标志着一个测试用例的结束。注意(0, 0)不作为任何一个测试用例里面的点。一个没有点的测试用例标志着整个输入的结束。
输出:
对每个测试用例,在1行内输出2对整数,其间用一个空格隔开。第1对整数是长方形框左下角的坐标,第2对整数是长方形框右上角的坐标。
如果只是一个点或者一条线,不输出。例如:
12 34
0 0
只是一个点,不是长方形,不输出。
样例输入:
12 56
23 56
13 10
0 0
12 34
0 0
0 0
样例输出:
12 10 23 56
/*
最小长方形
描述:
给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内。长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内。
运行时间限制: 10 Sec
内存限制: 128 MByte
输入:
测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标(x y) 占一行,其中|x|和|y|小于 1000;一对(0,0) 坐标标志着一个测试用例的结束。注意(0, 0)不作为任何一个测试用例里面的点。一个没有点的测试用例标志着整个输入的结束。
输出:
对每个测试用例,在1行内输出2对整数,其间用一个空格隔开。第1对整数是长方形框左下角的坐标,第2对整数是长方形框右上角的坐标。
如果只是一个点或者一条线,不输出。例如:
12 34
0 0
只是一个点,不是长方形,不输出。
样例输入:
12 56
23 56
13 10
0 0
12 34
0 0
0 0
样例输出:
12 10 23 56
*/
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAX 1005
int minLeft,minRight,maxLeft,maxRight;
int main()
{
int a,b;
//freopen("text.txt","r",stdin);
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a==0&&b==0)
break;
minLeft=minRight=MAX;
maxLeft=maxRight=-MAX;
minLeft=a<minLeft?a:minLeft;
minRight=b<minRight?b:minRight;
maxLeft=a>maxLeft?a:maxLeft;
maxRight=b>maxRight?b:maxRight;
int k=1;//点的个数
while(scanf("%d%d",&a,&b))
{
if(a==0&&b==0)
break;
k++;
minLeft=a<minLeft?a:minLeft;
minRight=b<minRight?b:minRight;
maxLeft=a>maxLeft?a:maxLeft;
maxRight=b>maxRight?b:maxRight;
}
if(k==1)
continue;
else
{
printf("%d %d %d %d\n",minLeft,minRight,maxLeft,maxRight);
}
}
return 0;
}
2 判断一个数字中是否包含两个相同的子串
描述:
判断给定的一个数字,把它当成字符串以后,该字符串中是否包含相同的两个子串,子串的长度要求大于等于2。
比如:12123,该数字包含两个“12”子串;
又比如:1223122,该数字包含两个“122”子串。
运行时间限制: 无限制
内存限制: 无限制
输入:
待判断的正整型数字,最大长度为9。
输出:
0:不包含;
1:包含。
样例输入:
12123
样例输出:
1
/*
判断一个数字中是否包含两个相同的子串
描述:
判断给定的一个数字,把它当成字符串以后,该字符串中是否包含相同的两个子串,子串的长度要求大于等于2。
比如:12123,该数字包含两个“12”子串;
又比如:1223122,该数字包含两个“122”子串。
运行时间限制: 无限制
内存限制: 无限制
输入:
待判断的正整型数字,最大长度为9。
输出:
0:不包含;
1:包含。
样例输入:
12123
样例输出:
1
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 10
char str[N];
int main()
{
int a,b;
//freopen("text.txt","r",stdin);
while(scanf("%s",str)!=EOF)
{
int len=strlen(str);
int flag=0;
for(int i=0;i<len && flag==0 ;i++)
{
for(int j=i+1;j<len && flag==0;j++)
{
int l=i,r=j,k=0;
while(str[l]==str[r])
{
l++;r++;
k++;
}
if(k>=2)
flag=1;
}
}
if(flag==1)
printf("1\n");
else
printf("0\n");
}
return 0;
}
3 取石子游戏
描述:
1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。
取完者胜.先取者负输出2.先取者胜输出1.
运行时间限制: 无限制
内存限制: 无限制
输入:
大于2的正整数。表示石子的个数
输出:
1或者2
样例输入:
3
样例输出:
2
/*
取石子游戏
描述:
1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。
取完者胜.先取者负输出2.先取者胜输出1.
运行时间限制: 无限制
内存限制: 无限制
输入:
大于2的正整数。表示石子的个数
输出:
1或者2
样例输入:
3
样例输出:
2
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int f[47];
//斐波那契数列 则第二人赢
void getResult()
{
f[0]=2;
f[1]=3;
for(int i=2;i<=45;i++)
{
f[i]=f[i-1]+f[i-2];
}
}
int main()
{
int a,flag;
//freopen("text.txt","r",stdin);
getResult();
while(scanf("%d",&a)!=EOF)
{
flag=1;
for(int i=0;i<46;i++)
{
if(f[i]==a)
{
flag=2;
break;
}
if(f[i]>a)
break;
}
printf("%d\n",flag);
}
return 0;
}
1 测试自动化6】城市电话号码
描述:
某城市电话号码由三部分组成,分别是:
地区码:空白或者三位数字;
前缀:非0开头的三位数字
后缀:4位数字
假定被测程序能接受一切符合上述规定的电话号码,输出0
拒绝一切不符合规定的电话号码,输出1.
请编写程序实现上述描述的功能.
运行时间限制: 10 Sec
内存限制: 200 MByte
输入:
地区码:空白或者三位数字;
前缀:非0开头的三位数字
后缀:4位数字
输出:
0或者1
样例输入:
111
111
1111
样例输出:
0
/*
【测试自动化6】城市电话号码
描述:
某城市电话号码由三部分组成,分别是:
地区码:空白或者三位数字;
前缀:非0开头的三位数字
后缀:4位数字
假定被测程序能接受一切符合上述规定的电话号码,输出0
拒绝一切不符合规定的电话号码,输出1.
请编写程序实现上述描述的功能.
运行时间限制: 10 Sec
内存限制: 200 MByte
输入:
地区码:空白或者三位数字;
前缀:非0开头的三位数字
后缀:4位数字
输出:
0或者1
样例输入:
111
111
1111
样例输出:
0
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 10
char a[N],b[N],c[N];
//题目描述 不严谨 空白?
int main()
{
int i;
//freopen("text.txt","r",stdin);
while(gets(a))
{
gets(b);
gets(c);
int flag=1;
int lenA=strlen(a);
int lenB=strlen(b);
int lenC=strlen(c);
if(!(lenA==0||lenA==3)||lenB!=3||lenC!=4)
flag=0;
if(flag==0)
printf("1\n");
else
{
for(i=0;i<lenA;i++)
if(!(a[i]>='0'&&a[i]<='9'))
flag=0;
if(b[0]=='0')
flag=0;
for(i=0;i<lenB;i++)
if(!(b[i]>='0'&&b[i]<='9'))
flag=0;
for(i=0;i<lenC;i++)
if(!(c[i]>='0'&&c[i]<='9'))
flag=0;
printf("%d\n",!flag);
}
}
return 0;
}
2 超长正整数相加
描述:
题目描述:请设计一个算法完成两个超长正整数的加法。
要求实现函数:
void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult);
输入参数:
char * pcAddend:加数
char * pcAugend:被加数
char * pcAddResult:加法结果
返回值:无
运行时间限制: 1 Sec
内存限制: 128 MByte
输入:
两个超长正整数的字符串
输出:
相加后结果的字符串
样例输入:
123456789123456789 123456789123456789
样例输出:
246913578246913578
/*
超长正整数相加
描述:
题目描述:请设计一个算法完成两个超长正整数的加法。
要求实现函数:
void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult);
输入参数:
char * pcAddend:加数
char * pcAugend:被加数
char * pcAddResult:加法结果
返回值:无
运行时间限制: 1 Sec
内存限制: 128 MByte
输入:
两个超长正整数的字符串
输出:
相加后结果的字符串
样例输入:
123456789123456789 123456789123456789
样例输出:
246913578246913578
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
#define N 100
char a[N],b[N];
//大数相加
int main()
{
int i;
//freopen("text.txt","r",stdin);
while(scanf("%s%s",a,b)!=EOF)
{
int len1=strlen(a),len2=strlen(b);
string c;
int i,j,t=0;
for(i=len1-1,j=len2-1;i>=0&&j>=0;i--,j--)
{
t=a[i]-'0'+b[j]-'0'+t;
c=(char)(t%10+'0')+c;
t=t/10;
}
while(i>=0)
{
t=a[i]-'0'+t;
c=(char)(t%10+'0')+c;
t=t/10;
i--;
}
while(j>=0)
{
t=b[j]-'0'+t;
c=(char)(t%10+'0')+c;
t=t/10;
j--;
}
while(t>0)
{
c=(char)(t%10+'0')+c;
t=t/10;
}
cout<<c<<endl;
}
return 0;
}
3 循环报数
描述:
输入1个数字和多个字符,中间均以空格隔开。假设数字取值为m(范围1~9),后面字符个数为n。假设n个字符围成一圈,从第一个字母开始循环报数,当数到m以后,第m个字母就出列,直到这n个字母全部出列。最后,按照出列的顺序输出这些字母,中间仍以空格隔开。取值范围:m为1到9, 字符个数n大于1小于20。
运行时间限制: 无限制
内存限制: 无限制
输入:
第一个为数字,后面为多个字符,均以空格隔开
输出:
输出重新排列后的字符,以空格隔开
样例输入:
3 a b c d e f g h i
样例输出:
c f i d h e b g a
答案提示:
建议采用循环链表
/*
循环报数
描述:
输入1个数字和多个字符,中间均以空格隔开。假设数字取值为m(范围1~9),后面字符个数为n。假设n个字符围成一圈,从第一个字母开始循环报数,当数到m以后,第m个字母就出列,直到这n个字母全部出列。最后,按照出列的顺序输出这些字母,中间仍以空格隔开。取值范围:m为1到9, 字符个数n大于1小于20。
运行时间限制: 无限制
内存限制: 无限制
输入:
第一个为数字,后面为多个字符,均以空格隔开
输出:
输出重新排列后的字符,以空格隔开
样例输入:
3 a b c d e f g h i
样例输出:
c f i d h e b g a
答案提示:
建议采用循环链表
AUTHOR:CIPHER
TIME:20150730
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
//那就用循环链表试试
//对于你们的题目输入输出描述 我也是醉了
#define N 50
char str[N];
struct node{
char val;
struct node *next;
node(int v)
{
val=v;
}
node(){
}
};
int main()
{
int m,i;
// freopen("text.txt","r",stdin);
while(gets(str))
{
m=str[0]-'0';
node *help=new node(1);
node *head=help;
int sum=0;
int len=strlen(str);
for(i=2;i<len;i++)
{
if(str[i]!=' ')
{
sum++;
node *tmp=new node();
tmp->val=str[i];
head->next=tmp;
head=head->next;
}
}
head->next=help->next;//成环
node *pre=head;
head=head->next;
int k=1;
while(sum>0&&head!=NULL)
{
if(k==m)
{
cout<<head->val;
pre->next=head->next;
head=pre->next;
sum--;
if(sum!=0)
cout<<" ";
k=1;
}
k++;
pre=pre->next;
head=head->next;
}
printf("\n");
}
return 0;
}
/*
最大递增数
2895345323
345
123526897215
2689
*/
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define N 100
char ss[N];
int main()
{
while(scanf("%s",ss)!=EOF)
{
int k,j,len=strlen(ss);
char max[N]="0";
for(int i=0;i<len;i++)
{
char tmp[N]="0",
k=0;
tmp[k++]=ss[i];
j=i+1;
while(j<len&&ss[j]>ss[j-1])
{
tmp[k++]=ss[j];
j++;
}
tmp[k]='\0';
if(strlen(max)<strlen(tmp)||(strlen(max)==strlen(tmp)&&strcmp(max,tmp)<0))
{
strcpy(max,tmp);
}
}
printf("%s\n",max);
}
return 0;
}
/*
最大递增数
2895345323
123526897215
11111
1
121221
111222
*/
/*
计算麻将的番数
1 1条2条3条
2 四张花色一样的 2番
3 巧七对,7对一样的牌 2番
番数相加
1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D.
1
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 50
char str[N];
int main()
{
int ans,len,i,j;
while(gets(str))
{
len=strlen(str);
ans=0;
//卡2条
for(i=0;i<len;i++)
{
if(str[i]=='T')
{
if(str[i-1]=='2')
{
if(i-3>=0&&str[i-3]=='1')
ans++;
}
}
}
//四归1,4张一样的牌
for(i=0;i<len;i++)
{
j=i;
while(str[j]!=','&&str[j]!='.')
j++;
if(j-i==8)
{
ans+=2;
}
i=j;
}
//一组牌恰好7对
j=0;//对数
for(i=0;i<len;i++)
{
if(str[i]==','||str[i]=='.')
{
j++;
}
}
if(j==7)
ans++;
printf("%d\n",ans);
}
return 0;
}
/*
3T4T5T,4T5T6T,7T8T9T,1D2D3D,4D4D.
1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D.
1T2T3T,1T2T3T,1T2T3T,1D2D3D,4D4D.
2T2T2T2T,1T2T3T,7T8T9T,1D2D3D,4D4D.
2T2T2T2T,2T2T2T2T,2T2T2T2T,4D4D.
2T2T,4T5T,7T7T,1D1D,4D4D,2D2D,2T2T.
*/
/*
单词迷宫
字符查找
5 5
SOLO
CPUCY
EKLQH
CRSOL
EKLQO
PGRBC
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 100
#define M 25
char str[N];
char map[M][M];
bool vis[M][M];
int m,n;
bool solve(int index,int x,int y)
{
if(index==strlen(str))
return true;
if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]==str[index]&&!vis[x][y])
{
vis[x][y]=1;
index++;
bool f=solve(index,x+1,y)||solve(index,x-1,y)||solve(index,x,y+1)||solve(index,x,y-1);
if(f)
return true;
else
vis[x][y]=0;
}
return false;
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
scanf("%s",str);
for(i=0;i<n;i++)
{
scanf("%s",map[i]);
}
bool f=0;
for(i=0;i<n && !f;i++)
{
for(j=0;j<m && !f;j++)
{
if(map[i][j]==str[0])
{
memset(vis,0,sizeof(vis));
f=solve(0,i,j);
}
}
}
if(f)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
/*
蛇形矩阵
5
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
*/
#include <iostream>
using namespace std;
int main()
{
int y,x;
int n;
cin>>n;
for(y=1; y<=n; y++)
{
for(x=1; x<=n-y; x++)
cout<<((x+y-1)*(x+y-1)+(x+y-1))/2-y+1<<" ";
cout<<((x+y-1)*(x+y-1)+(x+y-1))/2-y+1;
cout<<endl;
}
return 0;
}
/*
单词倒排
样例输入
I am a student
样例输入
student a am I
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
#define N 25
char str[N];
int main()
{
while(gets(str))
{
int len=strlen(str);
string ans;
for(int i=len-1;i>=0;)
{
while(i>=0&&str[i]==' ')
i--;
string tmp;
while(i>=0&&str[i]!=' ')
{
tmp=str[i]+tmp;
i--;
}
if(ans.size()>0)
ans+=' ';
ans+=tmp;
}
cout<<ans<<endl;
}
return 0;
}
/*
判断字符串中的最长回文串
abdbdc
aaaaa
abcabca
abccba
a
aa
ab
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 50
#define INF 9999999
char str[N];
int main()
{
int i;
while(gets(str))
{
int len=strlen(str);
int max=-INF;
int left,right;
for(i=0;i<len;i++)
{
left=i-1;
right=i+1;
while(left>=0&&right<len&&str[left]==str[right])
{
left--;
right++;
}
if(right-left-1>max)
{
max=right-left-1;
}
left=i;
right=i+1;
while(left>=0&&right<len&&str[left]==str[right])
{
left--;
right++;
}
if(right-left-1>max)
{
max=right-left-1;
}
}
printf("%d\n",max);
}
return 0;
}
/*
精确计算2的N次方;N(100=N=1000)
200
1606938044258990275541962092341162602522202993782792835301376
*/
#include<iostream>
#include<stdio.h>
using namespace std;
#define N 1000
int ans[N];
int main()
{
int n,k,i,j,tmp,t;
while(scanf("%d",&n)!=EOF)//100<=N<=1000
{
memset(ans,0,sizeof(ans));
k=0;
ans[0]=1;
for(i=1;i<=n;i++)
{
for(j=0;j<=k;j++)
ans[j]*=2;
t=0;
for(j=0;j<=k;j++)
{
tmp=ans[j]+t;
ans[j]=tmp%10;
t=tmp/10;
}
if(t>0)
{
k++;
ans[k]=t;
}
}
for(i=k;i>=0;i--)
printf("%d",ans[i]);
printf("\n");
}
return 0;
}
/*
给定数组,奇数最大放中间,偶数,最大的放中间靠右位置,一左一右放剩下的数
5
3 6 1 9 7
6
3 6 1 9 7 8
3 7 9 6 1
1 6 8 9 7 3
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 50
int a[N],ans[N];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int i,n,left,right,k;
char arr[N];
while(scanf("%d",&n)!=EOF)//n>0
{
// itoa(n,arr,8);
// for(i=0;i<strlen(arr);i++)
// cout<<arr[i];
// cout<<endl;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
right=n/2;
left=n/2-1;
k=0;
while(k<n)
{
ans[right]=a[k];
k++;
right++;
if(k>=n)
break;
ans[left]=a[k];
k++;
left--;
}
for(i=0;i<n-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}
return 0;
}
/*
表达式求值
输入字符串长度不超过100,包含+ —* / ( );
*/
#include <iostream>
#include <string>
#include <stack>
#include "stdlib.h"
using namespace std;
int pri(char m)
{
switch(m)
{ case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
case ')':
return 0;
case '#':
return -1;
default:
break;
}
}
int getResult(string s)
{
stack<int>value;
stack<char>fuhao;
s=s+"#$";
if(s[0]=='-')
s="0"+s;
int i=0;
int c=0;
while(s[i]!='$')
{
if(s[i]<='9'&&s[i]>='0')//数字
{
c=s[i]-'0';
i++;
while(s[i]<='9'&&s[i]>='0')
{
c=c*10+s[i]-'0';
i++;
}
i--;
value.push(c);
c=0;
}
else if(fuhao.size()==0||s[i]=='(' || pri(s[i])>pri(fuhao.top()))
fuhao.push(s[i]);
else if(s[i]==')')
{
for(;fuhao.top()!='(';fuhao.pop())
{
char d=fuhao.top();
fuhao.pop();
int a=value.top();
value.pop();
int b=value.top();
value.pop();
switch(d)
{
case '+':
a=a+b;
break;
case '-':
a=b-a;
break;
case '*':
a=a*b;
break;
case '/':
a=b/a;
break;
default:
break;
}
value.push(a);
}
}
else
{
for(;fuhao.size()!=0&&pri(s[i])<=pri(fuhao.top());)
{
char d=fuhao.top();
fuhao.pop();
int a=value.top();
value.pop();
int b=value.top();
value.pop();
switch(d)
{
case '+':
a=a+b;
break;
case '-':
a=b-a;
break;
case '*':
a=a*b;
break;
case '/':
a=b/a;
break;
}
value.push(a);
}
fuhao.push(s[i]);
}
i++;
}
return value.top();
}
int main(void)
{
string a;
while(cin>>a){
cout<<getResult(a)<<endl;
}
return 0;
}
/*
最小公倍数
*/
#include <iostream>
using namespace std;
int gdc(int x,int y)
{
return (!y)?x:gdc(y,x%y);
}
int main()
{
int a,b;
while(cin>>a>>b)
{
cout<<(a*b)/gdc(a,b)<<endl;
}
return 0;
}
/*
编程实现,将输入字符串字符按如下规则排序
1:英文字母A到Z排序,不区分大小写
2: 同一个英文字符大小写同时存在时,按照输入排序
3: 说非英文字符位置不变
A Famous Saying: Much Ado About Nothing (2012/8).
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 100
char str[N];
int main()
{
int i,j;
while(gets(str))
{
int len=strlen(str);
for(i=0;i<len;i++)
{
if( (str[i]>='a'&&str[i]<='z') || (str[i]>='A'&&str[i]<='Z'))
{
char a=tolower(str[i]);
for(j=0;j<i;j++)
{
if( (str[j]>='a'&&str[j]<='z') || (str[j]>='A'&&str[j]<='Z'))
if(tolower(str[j])>a)
{
char tmp=str[i];
str[i]=str[j];
str[j]=tmp;
}
}
}
}
printf("%s\n",str);
}
return 0;
}