面试必备经典CC++面试算法实例.docx
《面试必备经典CC++面试算法实例.docx》由会员分享,可在线阅读,更多相关《面试必备经典CC++面试算法实例.docx(26页珍藏版)》请在冰豆网上搜索。
面试必备经典CC++面试算法实例
Example2:
冒泡法排序
//maopao.cpp:
定义控制台应用程序的入口点。
#include"stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
inta[10];
inti,j,t;
printf("input10numbers:
\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)//控制循环扫描共n-1次
for(j=0;j<9-i;j++)//每次比较次数为n-i-1次
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
printf("thesortednumbers:
\n");
for(i=0;i<10;i++)
printf("%3d",a[i]);
return0;
}
Example3:
将一个二维数组行和列元素互换,存到另一个二维数组里。
//Exchange.cpp:
定义控制台应用程序的入口点。
#include"stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
inta[2][3]={{1,2,3},{4,5,6}};
intb[3][2];
printf("arraya:
\n");
for(inti=0;i<2;i++)
{
for(intj=0;j<3;j++)
{
printf("%5d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("arrayb:
\n");
for(inti=0;i<3;i++)
{
for(intj=0;j<2;j++)
printf("%5d",b[i][j]);
printf("\n");
}
return0;
}
Example4:
求一个3*4的矩阵的最大值,并输出其所在的行和列
#include"stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
inti,j,row=0,colum=0,max;
inta[3][4]={{10,5,36,2},{-18,6,28,-36},{2,15,-10,-89}};
max=a[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(a[i][j]>max)
{
max=a[i][j];
row=i;
colum=j;
}
printf("max=%d,row=%d,cloum=%d",max,row,colum);
return0;
}
Example5:
输出一个字符串
#include"stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
chara[15]={'h','o','w','','a','r','e','','y','o','u'};
for(inti=0;i<11;i++)
printf("%c",a[i]);
printf("\n");
return0;
}
注意单词之间的空格赋值
Example6:
利用一个scanf函数输入多个字符串,以空格分开
#include"stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
charstr1[5],str2[5],str3[5],str4[13];
printf("inputthreestring:
\n");
scanf("%s%s%s",str1,str2,str3);
printf("%5s%5s%5s\n",str1,str2,str3);
printf("inputonestring:
\n");
scanf("%s",str4);
printf("%s\n",str4);
return0;
}
注:
把以n个用空格分开字符串输入给一个字符串数组,则其实数组只接收到第一个空格之前的内容,违背愿望。
Example7:
输入一行字符串,统计其中有多少个单词,单词之间用空格分开
#include"stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
charstr[100];
intnum=1;
intword;
printf("inputstrings:
\n");
gets(str);
for(inti=0;str[i]!
='\0';i++)
/*if(str[i]=='')num++;若只用着一个判断,则如果输入字符串时不小心敲进了很多空格,则结果不对*/
if(str[i]=='')word=0;
elseif(word==0)
{
word=1;
num++;
}
printf("Thereare%dwordsintheline.\n",num);
return0;
}
Example8:
找出3个字符串中的最大者
#include"stdafx.h"
#include
int_tmain(intargc,_TCHAR*argv[])
{
charstring[20];
charstr[3][20];
printf("inputthreestrings:
\n");
for(inti=0;i<3;i++)
scanf("%s",str[i]);
if(strcmp(str[0],str[1])>0)strcpy(string,str[0]);
elsestrcpy(string,str[1]);
if(strcmp(str[2],string)>0)strcpy(string,str[2]);
printf("\nthelargeststringis:
\n%s\n",string);
return0;
}
Example9:
选择法排序
#include"stdafx.h"
voidsort(inta[],intn)
{
intmin,t;
for(inti=0;i{
min=i;
for(intj=i+1;j{
if(a[min]>a[j])
{
min=j;
}
}
if(min!
=i)
{
t=a[min];
a[min]=a[i];
a[i]=t;
}
}
}
int_tmain(intargc,_TCHAR*argv[])
{
inta[10]={3,9,1,8,2,10,7,5,4,6};
sort(a,10);
for(inti=0;i<10;i++)
printf("%4d",a[i]);
return0;
}
Example10:
求一个3*3的整形矩阵对角线元素之和
#include"stdafx.h"
intcatercornerSum(inta[3][3])
{
intsum=0;
for(inti=0;i<3;i++)
{
sum+=a[i][i];
sum+=a[i][2-i];
}
sum-=a[1][1];
returnsum;
}
int_tmain(intargc,_TCHAR*argv[])
{
inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};
intsum;
sum=catercornerSum(a);
printf("%d\n",sum);
return0;
}
Example11:
找出一个数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小
#include"stdafx.h"
#include
usingnamespacestd;
int_tmain(intargc,_TCHAR*argv[])
{
inta[3][4]=
{{124,25,100,31},{20,96,216,95},{14,25,54,1}};
intb[3];
intc[4];
charx=NULL;
chary=NULL;
/*cout<<"pleaseinput12integernumbers:
"<for(inti=0;i<3;i++)
{
for(intj=0;j<4;j++)
{
cin>>a[i][j];
}
}*/
intt=0;
for(inti=0;i<3;i++)
{
t=a[i][0];
b[i]=0;
for(intj=0;j<4;j++)
{
if(a[i][j]>t)
{
t=a[i][j];
b[i]=j;
}
}
}
for(intj=0;j<4;j++)
{
t=a[0][j];
c[j]=0;
for(inti=0;i<3;i++)
{
if(a[i][j]{
t=a[i][j];
c[j]=i;
}
}
}
for(inti=0;i<3;i++)
{
for(intj=0;j<4;j++)
{
if((i==c[j])&&(j==b[i]))
{
x=i+1+48;
y=j+1+48;
t=a[i][j];
}
}
}
if((x==NULL)&(y==NULL))
cout<<"该二位数组没有鞍点"<else
{
cout<<"鞍点位置:
("<cout<<"鞍点位置数字为:
"<}
return0;
}
说明:
分别记下每一行最大值及每一列最小值的位置,该两位置重复的点即是鞍点
字符串
Example1:
编写字符串拷贝函数strcpy
//strcpy.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
char*strcpy(char*strDest,constchar*strSrc)
{
char*address=strDest;
while((*strDest++=*strSrc++)!
='\0')
NULL;
returnaddress;
}
int_tmain(intargc,_TCHAR*argv[])
{
charstr1[]="asfasdfasfa";
intlength=0;
char*str2=newchar[20];
strcpy(str2,str1);
printf("str2:
%s\n",str2);
printf("copysuccessfully!
\n");
delete[]str2;
return0;
}
Example2:
字符串连接函数strcat
//strcat.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
char*strcat(char*str1,char*str2)
{
inti=0;
intj=0;
while(str1[i])
i++;
while(str2[j])
j++;
char*str3=newchar[i+j+1];
for(intm=0;m
{
str3[m]=str1[m];
}
for(intm=0;m{
str3[m+i]=str2[m];
}
str3[i+j]='\0';
returnstr3;
}
int_tmain(intargc,_TCHAR*argv[])
{
char*str1="ggg";
char*str2="bbbb";
char*str3=newchar[20];
str3=strcat(str1,str2);
printf("thestringstr3is:
%s\n",str3);
delete[]str3;
return0;
}
Example3:
删除已经在str2中出现过的str1中的字符
#include"stdafx.h"
#include
int_tmain(intargc,_TCHAR*argv[])
{
charstr1[]="ahadfggklgfd";
char*str2="dff";
char*str3=newchar[10];
intlength1=int(strlen(str1));
intlength2=int(strlen(str2));
intm=0;
for(inti=0;i{
for(intj=0;j{
if(str1[i]==str2[j])//str1中的该字符在str2中出现
{
str1[i]=str2[0];//将所有在str2中出现过的str1中的字符全部改为str2的第一字符值
j=length2;//跳出内层for循环
}
}
}
for(inti=0;i{
if(str1[i]!
=str2[0])
{
str3[m]=str1[i];
m+=1;
}
}
str3[m]='\0';//将str3最后加上'\0',str3即为删除后的结果
printf("%s\n",str3);
delete[]str3;
return0;
}
Example4:
字符串倒置,“Justdoit”变为“tiodtsuJ”
#include"stdafx.h"
#include
voidinversion(char*p1,char*p2)
{
inti;
intlength=int(strlen(p1));
for(i=0;i{
p2[i]=p1[length-1-i];
}
p2[i]='\0';
}
int_tmain(intargc,_TCHAR*argv[])
{
char*p1="Justdoit";
char*p2=newchar[20];
inversion(p1,p2);
printf("%s\n",p2);
return0;
}
Example5:
将字符串中的单词倒置,“Justdoit”变为“itdoJust”
#include"stdafx.h"
//定义一个字符串倒置函数,其中参数包括字符串及需要到置部分的起点和终点
voidreverse(charstr[],intfrom,intto)
{
intlength=to-from;
chars;
for(inti=0;i{
s=str[from+i];
str[from+i]=str[to-i];
str[to-i]=s;
}
}
int_tmain(intargc,_TCHAR*argv[])
{
charstr1[]="Makeprogresseverydaytolearnabcabcdabcde";
intlength=0;
while(str1[length])
{
length++;
}
reverse(str1,0,length-1);//先将str1整个颠倒
inti=0;//可理解为慢指针
intj=0;//可理解为快指针
while(str1[j])//扫描倒置过的str1
{
if(j<=length)//当还没扫描完str1时
{
while(str1[j]!
=''&&str1[j])//碰到空格及为一个单词的倒置,再给颠倒回来就可
{
j++;
}
reverse(str1,i,j-1);
j++;//将快指针指向空格后的第一个字符
i=j;//将满指针指向下一个单词,以便接下来将单词颠倒回来
}
else//说明已经扫描完
{
j--;//将快指针指向字符串后的'\0',跳出while循环
}
}
printf("%s\n",str1);
return0;
}
Example6:
统计字符串每个字符出现的次数
#include"stdafx.h"
#include
usingnamespacestd;
int_tmain(intargc,_TCHAR*argv[])
{
charstr1[50]="ddfd;ljk90()asdHSMAR___!
@#$%^&*()";
char*p=newchar[50];
inttimes;
inta[50];
inti=0;
intt=0;//用于判断字符是否重复出现
intm=0;
intlength1=0;
while(str1[i]!
='\0')
{
length1++;
i++;
}
p[m]=str1[0];
intlength2=1;//length2为p指向字符串的长度,初始为
//去掉字符串str1中重复出现过的字符(保留一个即可),把剩余的字符保存到指针p指向的动态存储区
for(inti=1;i{
t=0;
for(intk=0;k{
if(str1[i]==p[k])t++;//说明该字符重复,t加
}
if(t==0)//t=0说明该字符没出现过,存入动态存储区
{
m++;
p[m]=str1[i];
length2++;
}
}
p[m+1]='\0';
//通过与p指向的字符串比较,即可得出每一个字符出现过的次数
for(inti=0;i{
a[i]=0;
for(intj=0;j{
if(p[i]==str1[j])a[i]++;
}
}
for(inti=0;iprintf("字符串%c出现次数为:
%d\n",p[i],a[i]);
return0;
}
Example7:
将整型数据转换成字符串类型
说明:
要将整型数据转换成字符串,首先将整型数据各个数位进行拆分,然后存储到一个数组当中,结尾处补‘\0’。
例如要将12345转换成字符串,主要思路是将12345先于10取余,结果为5,将5转成字符存储到数组当中,然后将1234除以10再与10取余得到十位上的数4,将4存储到数组中,以此类推。
得到数组54321,再将数组逆序返回。
循环的条件控制是判断整数与10相除的结果,如果是0的话结束循环。
代码:
//E4.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
//将int转换为string
char*ToString(intnumber)
{
char*str=newchar[6];
inti=0;
while(number/10!
=0)
{
str[i++]=number%10+48;//字符'0'比整数大
number=number/10;//去掉个位数
}
str[i++]=number+48;//将最后一个整数转换为字符
str[i]='\0';
for(intj=0;j<(i-1)/2;j++)//颠倒字符串“”
{
inta=str[j];
str[j]=str[i-1-j];
str[i-1-j]=a;
}
returnstr;
}
int_tmain(intargc,_TCHAR*argv[])
{
inta=12345;
char*str=ToString(a);
printf("%s\n",str);
return0;
}
注意:
当循环结束时整数的最高位还未转成字符,所以循环结束后要将最高位转成字符并且要在结尾加上‘\0’表示字符串结束。
Example8:
将字符串转换成整型数据
//ToInt.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
intToInt(char*p)
{
intl=0;
inta[5];
while(p[l])
{
a[l++]=p[l]-