一些关于字符串的面试题

几道很值得参考的字符串问题
服务器君一共花费了212.283 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

计算机笔试和面试最常考察的就是字符串的各种操作。字符串处理是我们程序员日常工作最常遇到的问题,能够体现程序员的基本功。下面我就最近一个月以来的各种笔试和面试遇到的有关字符串处理的题目和大家分享一下:

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

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

int MinNextStr(const char* src,char* &minnext)
{
	int srclen=strlen(src);
	minnext=(char*)malloc((srclen+1)*sizeof(char));
	if(minnext==NULL)
	{
		return -1;
	}
	strcpy(minnext,src);
	int i=srclen-1;
	while(i>=0)
	{
		minnext[i]++;
		if(minnext[i]<='z')
		{
			break;
		}
		i--;
	}
	if(i<0)
	{
		return 0;
	}
	else
	{
		minnext[++i]='\0';
		return 1;
	}
}

如果把给定字符串全为小写英文字母改为大小写英文字母,则只要把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"

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

int RightMoveStr(char* src,int n)
{
	int len=strlen(src);
	int mov=n%len;
	char* rstr=(char*)malloc((mov+1)*sizeof(char));
	if(rstr==NULL)
	{
		return 0;
	}
	int i=0;
	while(i<mov)
	{
		rstr[i]=src[len-mov+i];
		i++;
	}
	rstr[i]='\0';
	i=len-mov-1;
	while(i>=0)
	{
		src[i+mov]=src[i];
		i--;
	}
	i=0;
	while(i<mov)
	{
		src[i]=rstr[i];
		i++;
	}
	free(rstr);
	return 1;
}

思路2:使用字符串库函数简化编码工作,用一个新的字符串ss保存结果,先把源字符串指针s移到需要右移的子串的第一个字符的位置,如"diopHeg"右移2位就把s移动到指向'e',接着 strcpy(ss,s),把s所指位置赋值为'\0',最后strcat(ss,s)。

int RightMove(char* src,char* &ssrc,int n)
{
	int len=strlen(src);
	ssrc=(char*)malloc(sizeof(char)*(len+1));
	n=n%len;
	if(ssrc==NULL)
	{
		return 0;
	}
	int i=0;
	char* s=src;
	while(i<len-n)
	{
		s++;
		i++;
	}
	strcpy(ssrc,s);
	*s='\0';
	strcat(ssrc,src);
	return 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

代码输出:dcba4321DCBA

本文地址:http://www.nowamagic.net/librarys/veda/detail/286,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/286

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《深入理解MySQL核心技术》 Sasba Pacbev (作者), 李芳 (译者), 于红芸 (译者), 邵健 (译者)

《深入理解MySQL核心技术》:从公共可用性的意义上讲,MySQL源代码是开放源代码,但如果对其不了解,则实质上,它对于您来说是封闭的。MysQL开发团队的前成员Sasha Pachev通过《深入理解MySQL核心技术》给出了MySQL 5的全面指南,揭示了这一强大数据库的内部运作。您将直奔MySQL核心技术,了解各种数据结构和各种方便的功能的运作情况,了解如何添加新的存储引擎和配置选项等。 《深入理解MySQL核心技术》从结构概况讲起,在这一部分解释了MysQL的不同组件是如何协同工作的。接着将学习设置有效的可编译代码副本的步骤,然后使用基本架构添加自己的配置变量和存储引擎。

更多计算机宝库...