华为机考MySQL_华为机考2

本文介绍了C++中字符串处理和数组操作的相关函数和技巧,包括字符串循环移位、字符替换、回文判断、字符串转整数、数组最小值查找、连续字符统计、子字符串查找、字符串大小写转换以及字符计数。此外,还涉及到了指针、内存管理和算法应用。
摘要由CSDN通过智能技术生成

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include

using namespacestd;void func(int *p, int n, intk);voidmain()

{int a[]={1,2,3,4,5};inti;

func(a,5,2);for(i=0;i<5;i++)

cout<

cout<

}void func(int *p ,int n, intk)

{inttemp;inti;

k=k%n;//n是总长度,k是移位位数,实际移位k%n

if(k>=0)//右移

{while(k)

{

temp=p[n-1];for(i=n-1;i>0;i--)

p[i]=p[i-1];

p[0]=temp;

k--;//临时数组存放最后一个数据,然后依次后移,k--;

}

}else if(k<0)

{

k=k*(-1);//左移

while(k)

{

temp=p[0];for(i=1;i

p[i-1]=p[i];

p[n-1]=temp;

k--;//临时数组存放第一个数据

}

}

}

View Code

7、数组循环移位

10.将字符串中的所有字母都替换成该字母的下一个字母

#include

using namespacestd;

#include#include#include

void func(char *p);voidmain()

{char str1[20];

printf("enter:");

gets(str1);

func(str1);

puts(str1);

}void func(char *p)

{charch;while(*p)

{ ch=*p;//临时字符//判断是否是字符,且不是z或者Z

if(isalpha(*p)&&(*p!='z')&&(*p!='Z'))、、*p=ch+1;else if(*p='z')*p='a';else if(*p='Z')*p='A';

p++;

}

}

回文判断

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include

using namespacestd;bool func(intm);voidmain()

{intm;

cout<

cin>>m;

cout<

}bool func(intm)

{int i,n=0;

i=m;while(i)

{

n=n*10+i%10;

i/=10;

}//就是把原数的位从低到高取出来,组成新数,两个数搞出来看看是否相等。。

if(m==n)return true;return false;

}

View Code

字符串转成整数

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include #include#include

using namespacestd;int func(chara[]);voidmain()

{char a[]={'1','2','3','4','\0'};

cout<

}int func(chara[])

{int i=0;int sum=0;while(a[i]!='\0')

{

sum=sum*10+(a[i]-'0');

i++;

}returnsum;

}

View Code

下面就说说为什么字符减'0'可以到相应的整数。现在比如我们要字符‘1’转换成数字1,就这么一个变化,我们看到了大家注意了字符型常量用''括起来的原因是,它们在计算机中都以各自的ASCII表示。而‘1’的对应编码是49的二进制码,但是我们的数字1,就等于1呀,所以为了由原来的‘1’实际上就是49的二进制变成现在的1对应的二进制1,只好用49-48=1了。但是在ASCII码里‘0’对应的刚好是48的二进制码,所以我们转换的时候只需要‘1’-‘0’=1;就可以了。而数字的ASCII码是按顺序规定的。所以其它字符要转换成数字都可以用减‘0’来表示。比如‘2’的ASCII是50,而我们要得到数字2,于是用‘2’-48=2了。看来当我们知道数据在计算机中的存储规则的时候,问题就迎刃而解了。

大小写字母的转换:先看ASCII码:a~z是97~122的二进制,而A~Z是65~90的二进制编码,于是我们就得出:大写字母=小写字母-32 ;这个公式了。当然这里的32我也可以这么写‘Z’=‘z’-'空格'。因为空格的ASCII码是32对应的二进制编码。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include #include

int main(void)

{floatn;char *str = "12345.67";

n=atoi(str);

printf("string = %s integer = %f\n", str, n);return 0;

}

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include #include

intmain()

{char a[] = "-100";char b[] = "123";intc ;

c= atoi( a ) +atoi( b ) ;

printf("c = %d\n", c) ;return 0;

}

View Code

int atoi(const char *nptr);

参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零,头文件: #include

13.求一个二维数组每列的最小值

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include

using namespacestd;void fun(int input[3][4], const int m, const int n, int output[4]);intmain()

{int input[3][4] = { {21,48,86,92},

{10,23,12,69},

{46,78,49,13}};int output[4];

fun(input,3, 4, output);

cout<

{for(int j=0; j<4; j++)

{

cout<

}

cout<

}

cout<

{

cout<

}

cout<

}void fun(int input[3][4], const int m, const int n, int output[4])

{int i = 0;int j = 0;for (i=0; i

{

output[i]= input[0][i];//暂存每一列的第一行元素

for (j=0; j

{if (output[i] >input[j][i])

{

output[i]= input[j][i];//依次比较得到每一列的最小值

}

}

}

}

View Code

14.连续字符统计(如AABCCCD:A2B1C3D1)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include #include#include

using namespacestd;void func(char str[],intlen);voidmain()

{char str[20];intlen;

cout<

gets(str);

len=strlen(str);

func(str,len);

}void func(char str[], intlen)

{int count=1;inti;for(i=0;i

{if(str[i]==str[i+1])

count++;//利用数组比较,也可用指针

else{

cout<

count=1;//碰到新元素。回归为0;

}

}

cout<

}

View Code

15.找出一个字符串中是否包含相同的子字符串(要求子串长度大于等于2)

包含文件:string.h

函数名: strstr

函数原型:extern char *strstr(char *str1, char *str2);功能:从字符串str1中查找是否有字符串str2,如果有,从str1中的str2位置起,返回str1中str2起始位置的指针,如果没有,返回null。

返回值:返回该位置的指针,如找不到,返回空指针。

例子:

char str[]="1234 xyz";char* str1=strstr(str,"34");cout<

原型:char * strncpy(char *dest, char *src,size_tnum);功能:(c/c++)复制src中的内容(字符,数字、汉字....)到dest,复制多少由num的值决定,返回指向dest的指针。如果遇到null字符('\0'),且还没有到num个字符时,就用(num - n)(n是遇到null字符前已经有的非null字符个数)个null字符附加到destination。注意:并不是添加到destination的最后,而是紧跟着由source中复制而来的字符后面。下面举例说明[1]:

char des[] = "Hello,i am!";char source[] = "abc\0def";strncpy(des,source,5);此时,des区域是这样的:a,b,c,\0,\0,逗号,i,空格,a,m,!

注意:\0,\0并不是添加在!的后面。

没看懂

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include #include

using namespacestd;int fun(char* str, intn)

{char *temp = new char[n+2];char *str2 =str;int sum = 0;int outsum = 0;char*t;for(int i = 0; i < n; i++)

{for(int j = 2; j <= n-i; j++)

{

sum= 0;

str2= str;//赋

memset(temp,0,(n+2)*sizeof(char));//初始化0

strncpy(temp, str+i, j);//

while((t = strstr(str2,temp)) !=NULL)

{

sum++;

str2= t+j;

}if( sum >outsum)

{

outsum=sum;

}

}

}if(outsum == 1)return 0;returnoutsum;

}intmain()

{char strstr[1000];

memset(strstr,0,sizeof(strstr));char *s =strstr;

cin>>s;int n =strlen(s);intoutsum;

outsum=fun(s,n);

cout<< outsum <

system("pause");return 0;

}

View Code

16.已知:yi er san si wu liu qi ba jiu 分别对应123456789,对一段只含有这几种字符的字符串进行转换,转换成相应的数字

#include #include

using namespacestd;char* sss[9] = {"yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};int fun(char*str)

{inti;int sum = 0;int d = 0;

i= 0;intj;while(str[i] != '\0')

{if(str[i] == 'y' || str[i] == 'e'|| str[i] == 'w' || str[i] == 'q' || str[i] == 'b')

d= 2;else if(str[i] == 'l' || str[i] == 'j')

d= 3;else if(str[i] == 's')

{if(str[i+1] == 'a')

d= 3;else d = 2;

}//确定碰到字符时移动的距离d

for(int k = 0; k < 9; k++)

{if(strncmp(str+i,sss[k],d) == 0)//匹配成功

j = k+1;//实际数字

sum = 10*sum +j;

}

i= i+d;//每比较一个字符串移动的距离//不考虑字符串不匹配的情形

}returnsum;

}intmain()

{char strstr[1000];

memset(strstr,0,sizeof(strstr));char *s =strstr;

cin>>s;intoutsum;

outsum=fun(s);

cout<< outsum <

system("pause");return 0;

}

17.删除字符串中字符个数最少的字符串

暂时没看懂

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include

#include

using namespace std;char* fun(char* str,int n)

{

int i=0; int j=0; int hash[256] = {0}; char *result = new char[n+1]; memset(result,0,(n+1)*sizeof(char));//开辟字符指针并初始化

for( i = 0;i < n; i++)

{

hash[str[i]]++;}

//每个字符的个数。用哈希值表示

int min= 0x7fffffff;for( i= 0;i < 256; i++)

{

if(hash[i] < min && hash[i] != 0)

min= hash[i];}

for(i= 0,j = 0;i < n; i++)

{

if(hash[str[i]] !=min)

{

result[j++] = str[i];}

}

return result;}

int main()

{

char strstr[1000]; memset(strstr,0,sizeof(strstr)); char *s = strstr; cin >> s;char *re= NULL;re= fun(s,strlen(s));cout << re << endl; system("pause"); return 0;}

View Code

C:

#include"stdio.h"//这个头文件包含gets()函数

int main(void)

{

char str1[5];gets(str1);printf("%s\n", str1);return 0;}

C++:

#include

using namespace std;int main()

{

char str[100];gets(str);cout<

gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。其调用格式为:

gets(s);其中s为字符串变量(字符串数组名或字符串指针)。

gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。

18.比较两个字符串,相等返回1,不等返回不等的位置

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include

#include

#include

using namespace std;void func(const char *str1,const char*str2);

void main()

{

char *str1,*str2; str1=new char[256]; str2=new char[256]; memset(str1,0,256*sizeof(char)); memset(str2,0,256*sizeof(char)); cout<

//从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读//取串的内容,读取的换行符被转换为null值,并由此来结束字符串。

func(str1,str2);}

void func(const char *str1,const char*str2)

{

int m,n; int k=0; int l,j; int i=0; m=strlen(str1); n=strlen(str2); while(*str1!='\0')

{

if(*str1==*str2)//||(abs(*str1-*str2)=='a'-'A'))

{str1++; str2++; k++;//k是位置。

}

else break;}

if(k==m&&n==m)//完全相等则为1

cout<

cout<

View Code

19.比较两个字符串是否相等,大小写也算相等

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include

#include

#include

using namespace std;bool func(const char *str1,const char*str2);

void main()

{

char *str1,*str2; bool m; str1=new char[256]; str2=new char[256]; memset(str1,0,256*sizeof(char)); memset(str2,0,256*sizeof(char)); cout<

bool func(const char *str1,const char*str2)

{

int m,n; int k=0; m=strlen(str1); n=strlen(str2); if(m!=n)

return false;else

{

while(*str1!='\0')

{

if(*str1==*str2||(abs(*str1-*str2)=='a'-'A'))//大小写的处理,相减为32

{str1++; str2++; k++;}

else break;}

}

cout<

return true;else

return false;}

View Code

20.将一句英文的每个单词的第一个字母大写

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#include

#include

#include

using namespace std;void func(char *ptr);

void main()

{

char *ptr;

ptr =new char[256];

memset(ptr, 0, sizeof(ptr));

cout<

gets(ptr);

func(ptr); cout<

void func(char *ptr)

{

char *ptr1;

ptr1=new char[256]; memset(ptr1, 0, sizeof(ptr1));

ptr1 = ptr;if(*ptr1

*ptr1=*ptr1;

else

*ptr1 -= 32;

while(*ptr1!='\0')

{

if(*ptr1==' ')

{

if(*(ptr1+1)

*(ptr1+1)=*(ptr1+1);

else

*(ptr1+1) -= 32;

}

ptr1++;

//空格后的第一个字符大写,减去32.

}

}

View Code

swap(a,b)值交换的四种方法:

[cpp]

void swap(int &a, int &b)

{

//方法一:

int tmp = 0;

tmp = b;

b = a;

a = tmp;

//方法二:

//a = a+b;

//b = a-b;

//a = a -b;

//方法三:

//a ^= b ^= a ^= b;

//方法四:

//a = a+b-(b=a);

}

int main(void)

{

int a = 3;

int b = 4;

printf("before swap: a = %d, b = %d\n", a, b);

swap(a, b);

printf("after swap: a = %d, b = %d\n", a, b);

return 0;

}

结果:

before swap: a = 3, b = 4

after swap: a = 4, b = 3

关于传参方式有三种:值传参、地址传参、引用传参(C++方法),上面使用的是第三种,引用传参,因为这种传参方式使得swap里面实现更为直观。当然,也可以使用第二种传参方式地址传参,不过,值传参是不行的哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值