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