本博客系列包含历年所有的复试机试题,以及自己找的一些相同难度的题,具有参考价值。
1.一组整数,由小到大排序,有n组测试数据,排序输出
输入样例:
2
1 5 8 6 3 2 0
4 2 3 8 15 63 20 1
Output:
0 1 2 3 5 6 8
1 2 3 4 8 15 20 63
解析:此处注意处理输入和输出即可。用5种做法,冒泡排序、插入排序,快排和归并排序,冒泡时间复杂度等价于插入排序为O(n^2),快排和归并排序复杂度O(nlogn)。归并排序和堆排序后续再补在末尾。
代码:
(1)冒泡排序:
#include
int main()
{
int n;
int a[100];
char ch;
scanf("%d",&n);
while(n--)
{
int i=0,num=0,j;
do{
scanf("%d",&a[i]);
i++;
}while(scanf("%c",&ch)&&ch!='\n');
num=i;
for(i=0;ia[j])
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
}
for(i=0;i
(2)插入排序
#include
#include
using namespace std;
int main()
{
int n;
int a[100];
char ch;
scanf("%d",&n);
while(n--)
{
int i=0,num=0;
do{
scanf("%d",&a[i]);
i++;
}while(scanf("%c",&ch)&&ch!='\n');
num=i;
for(i=1;i=0&&a[j]>tmp要同时满足
for(j=i-1;j>=0&&a[j]>tmp;j--)
a[j+1]=a[j];
a[j+1]=tmp;
}
}
for(i=0;i
(3)快速排序
此处使用两种写法,但思想是一样的:
做法一:
#include
#include
using namespace std;
int Partion(int a[],int i,int j)//每次返回被分的基值下标,下次分别排两边即可
{
int tmp=a[i];//首元素作为基值
while(ia[i])
i++;
if(i
做法二:
#include
#include
using namespace std;
void QuickSort(int a[],int left,int right)
{
int i=left,j=right;
int tmp=a[i];//首元素作为基值
if(i>=j)//如果没元素的话,结束
return ;
while(ia[i])
i++;
if(i
(4)归并排序:
#include
#include
using namespace std;
int a[10001],n,d[10001];
void Merge(int low,int mid,int high)
{ //把两个数组合并成一个,并转到原来的数组
int i=low,j=mid+1;
int m=mid,n=high;
int k=0;
while(i<=m&&j<=n)
{
if(a[i]<=a[j])
d[k++]=a[i++];
else
d[k++]=a[j++];
}
while(i<=m)
d[k++]=a[i++];
while(j<=n)
d[k++]=a[j++];
for (i=0;i
2.利用海伦公式求三角形面积,是三角形则输出面积(保留两位小数),否则输出NaN。
Input:
2
3.0 4.0 5.0
1.0 2.0 3.0
Output:
6.00
NaN
代码:
#include
#include
#include
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
double a,b,c;
cin>>a>>b>>c;
if(a+b>c&&a+c>b&&b+c>a)
{
double p,s;
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
printf("%.2lf\n",s);
}
else
cout<<"NaN"<
3.判断ip地址是否合法,以字符串形式输入,格式为a.b.c.d,若每个均为整数且范围在[0,255]之间,则说明是合法的,输出yes,否则输出no。
输入样例:
2
255.2.26.2
1.2.333.4
Output:
yes
no
代码:
#include
#include
#include
using namespace std;
int main()
{
int n;
cin>>n;
getchar();
while(n--)
{
string str;
getline(cin,str);
int len=str.size();
int dotnum=0;
int tmp=0;
int flag=1;
if(!isdigit(str[0])||!isdigit(str[0]))
flag=0;//此句很重要,保证数字开头数字结尾
for(int i=0;i3)
{
flag=0;
break;
}
if(tmp>255||tmp<0)
{
flag=0;
break;
}
tmp=0;
}
else
{
flag=0;
break;
}
}
if(dotnum!=3)
flag=0;
if(flag==1)
cout<<"yes"<
上面属于憨批做法,下面分享神奇的sscanf和sprintf!!!!
#include
#include
int main()
{
char str[31],temp[31];
int a,b,c,d;
while(gets(str)!=NULL)
{
if(sscanf(str,"%d.%d.%d.%d ",&a,&b,&c,&d)==4&&a>=0&&a<=255&&b>=0&&b<=255&&c>=0&&c<=255&&d>=0&&d<=255)
{
sprintf(temp,"%d.%d.%d.%d",a,b,c,d); //把格式化的数据写入字符串temp
if(strcmp(temp,str)==0)
printf("yes\n");
else
printf("no\n");
}
else
printf("no\n");
}
return 0; }
4.从m开始找出n个质数,如果m是,也输出m。
输入样例:
4 3
Output:
5
7
11
代码:
#include
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
for(int tmp=m;n>0;tmp++)
{
int flag=1;
for(int i=2;i<=tmp/2;i++)
{
if(tmp%i==0)
{
flag=0;
break;
}
}
if(flag==1)
{
cout<
5.求任意两天的日期差。
输入样例:
2
2016 1 1 2016 3 1
2019 1 1 2019 1 2
OutPut:
61
2
解析:其实不太复杂,分清步骤来即可,详见代码。
代码:
#include
using namespace std;
int IsLeapYear(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)
return 1;
else
return 0;
}
int IsBigMon(int month)
{
switch(month)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
return 1;
default:
return 0;
}
}
int Same_Year(int y1,int m1,int d1,int y2,int m2,int d2)
{
int days=0;
if(m1==m2)
days+=d2-d1;
else
{
if(IsBigMon(m1))
days+=31-d1;
else
{
if(m1==2)
{
if(IsLeapYear(y1))
days+=29-d1;
else
days+=28-d1;
}
else
days+=30-d1;
}
for(int i=m1+1;i>n;
while(n--)
{
int days=0;
int y1,m1,d1,y2,m2,d2;
cin>>y1>>m1>>d1>>y2>>m2>>d2;
//第一步算中间整年的
if(y1==y2)
days=Same_Year(y1,m1,d1,y2,m2,d2);
else
{
days+=Same_Year(y1,m1,d1,y1,12,31);
for(int i=y1+1;i
1.求积:给定n组数,每组两个整数,输出这两个整数的乘积
Input:
2
1 1
2 3
Output:
1
6
2.阶乘:给定n组数,每组一个整数,输出该组数的阶乘;
Input:
2
3
5
Output:
6
120
3.C(n,m):求n个数中任取m个数的不同取法个数
Input:
10 3
Output:
120
4.给定n组数,每组m个,对每组数进行从小到大排序:
Input:
2 4
3 5 2 8
2 7 9 8
Output:
2 3 5 8
2 7 8 9
解析:以上题目过于简单,博主拒绝做/狗头保命/,第四题排序,见本文第一题
5.字符串反转:给定n组字符串,每组字符串不超过20,输出每组字符串的反串
Input:
3
nwpu
china
xi an
Output:
upwn
anihc
na ix
代码:
#include
#include
#include
using namespace std;
int main()
{
int n;
cin>>n;
getchar();
while(n--)
{
string str;
getline(cin,str);
int len=str.size();
for(int i=len-1;i>=0;i--)
cout<
6.判断是否回文,包括空格、数字、英文、符号,若是输出yes,否则输出no;
Input:
4
nwpu
madam
1001
xi ix
Output:
no
yes
yes
yes
代码:
#include
#include
#include
using namespace std;
int main()
{
int n;
cin>>n;
getchar();
while(n--)
{
string str;
getline(cin,str);
int len=str.size();
int flag=1;
for(int i=0;i<=len/2;i++)
{
if(str[i]!=str[len-i-1])
{
flag=0;
break;
}
}
if(flag==1)
cout<<"yes"<
7.判断括号是否匹配:给定n组数,每组为一个字符串,测试三种括号:{}()[],且顺序都是前左括号,后右括号,括号之间可以嵌套。若匹配则输出yes,否则输出no;
Input:
2
{9}[00](tt)
{[](}
Output:
yes
no
解析:此题也不难,需要用到栈,说一下大体思想。建一个栈,将每个左括号存进去,遇到一个右括号就与栈顶元素比较,相对应就正确并且出栈,对应不上就出错。详见代码。
代码:
#include
#include
#include
#include
using namespace std;
int main()
{
int n;
cin>>n;
getchar();
while(n--)
{
string str;
stacks;
while(!s.empty())//清空栈
s.pop();
cin>>str;
int len=str.size();
int flag=1;
for(int i=0;i