c++笔试面试题

1、google笔试:编码实现求给定字符串(全为小写英文字母)的最小后继,如"abc"的最小后继为"abd","dhz"的最小后继为"di"。

思路:题目比较简单,对最后一个字符+1,如果大于'z'则对前一个字符+1,如果又是大于 'z' 则重复之前步骤。所以写代码时,我们只要对字符串循环从后往前对每一个字符进行+1,直到出现+1后不超过'z'为止。如果退出循环时第一个字符大于于'z'则提示不存在,否则把退出循环的字符的后一位置为'\0'即可。

bool MinNextstr(const char *str,char *&dst)
{
	int length = strlen(str);
	dst = (char*)malloc((length+1)*sizeof(char));
	strcpy(dst,str);
	int i=length-1;
	while(i>=0)
	{
		dst[i]++;
		if(dst[i]<='z')
			break;
	    i--;
	}
	if(i<0)
		return false;
	else
	{
	   dst[++i]='\0';
	   return true;
	}
}
如果把给定字符串全为小写英文字母改为大小写英文字母,则只要把if(minnext[i]<='z') 改为 if(minnext[i]<='z'&&minnext[i]>'a'||minnext[i]<='Z')

注意minnext[i]<='z'&&minnext[i]>'a'是为了防止minnext[i]为大写的情况,因为大写英文字母(A:65)比小写(a:97)的ASCII 码小,如果不加minnext[i]>'a'则minnext[i]为('Z'+1,ASCII 码:91)也会跳出循环。



2 中兴:编码实现字符串右移n位,如"diopHeg"右移2位为"egdiopH"

思路一:只要把需要移动的最后n个字符保存下来,把前面剩下的全部后移n个位置,最后把开始保存好的n 个字符填充到前面n个位置。注意:n超过字符串长度的情况,所以事前先做n mod 字符串的长度。

void StrMoveRight(char *str,int n)
{
	int len=strlen(str);
	n=n%len;
	int m=0;
	char *p =(char*)malloc((n+1)*sizeof(char));
	for(int i=len-n;i<len;i++)
		p[m++]=str[i];
	p[m]='\0';
	for(int i=len-n-1;i>=0;i--)
		str[i+n]=str[i];
	for(int i=0;i<n;i++)
		str[i]=p[i];
}

思路二:将后n个字符倒置,然后将剩下的倒置,最后将所有字符倒置

void Covert(char str[],int start,int end)
{
	int mid = (start+end)/2;
	for(int i=start;i<=mid;i++)
	{
		char ch=str[i];
		str[i]=str[end];
		str[end--]=ch;
	}
}

void StrMoveRight(char *str,int n)  
{
	int len = strlen(str);
	n%=len;
	Covert(str,len-n,len-1);
	Covert(str,0,len-n-1);
	Covert(str,0,len-1);
}



3 新邮通:字符串反转:给定字符串"we;tonight;you;",编码实现输出"ew;thginot;uoy;"

思路:使用两个变量first和end分别记录当前需要反转的子串的头和尾字符的下标,每遇到';'就把first和end之间的子串进行前后反转。

void ReverseStr(char *src)
{
	int len=strlen(src);
	int i=0;
	int first=0;
	int end=0;
	while(i<len)
	{
		if(src[i]==';')
		{
			end=i-1;
			while(first<end)
			{
				char temp=src[first];
				src[first]=src[end];
				src[end]=temp;
				first++;
				end--;
			}
			first=i+1;
		}
		i++;
	}
}

如果给定字符串结尾没有';',如"we;tonight;you",编码实现输出"ew;thginot;uoy"。

只需要修改一下代码9、10、11行:

if(src[i]==';'||i==len-1)
{
	if(src[i]==';')
		end=i-1;
	else
  		end=i;
}



4 西艾:X86结构下,下面代码输出结果是什么?

char str[20]="Good night";
int* p=(int*)str;
p[0]=0x61626364;
p[1]=0x31323334;
p[2]=0x41424344;
cout<<str<<endl;
解题:考察知识点:
  1. int的内存大小:32bit=4byte;char的内存大小:4bit=1byte;
  2. 常用字符的ASCII 码,'a':97;'A'=65;'0'=48;
  3. 十六进制转,0x61=97;
  4. 大小端模式:所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

而X86结构为小端模式,所以

p[0]=0x61626364;//97,98,99,100对应a,b,c,d,小端存在字符串str则为dcba 
p[1]=0x31323334;//同理4321 
p[2]=0x41424344;//同理DCBA


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值