(一)面试金典算法:数组与字符串

(1)实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理?

算法:构建一个布尔值的数组,索引值i对应的标记指示该字符串是否含有字母表第i个字符(以ASCII编码表为例,其中包含256个字符)。若这个字符第二次出现,则立刻返回false。

<span style="white-space:pre">	</span>public boolean isDiff(String str)
	{
		if(str.length() > 256)
			return false;
		//ascii码有256个字符,初始化boolean默认false
		boolean[] char_set = new boolean[256]; 
		if(str != null)
		{
			for(int i=0; i<str.length(); i++)
			{
				int index = str.charAt(i);
				//存在重复的字符返回false
				if(char_set[index])
					return false;		
				char_set[index] = true;
			}
		}
		return true;
	}

(2)用C或C++实现void reverse(char* str)函数,即反转一个null结尾的字符串。

算法:处理字符串操作,常见做法是从字符串尾部开始编辑,从后往前反向操作。

首先用一个指针end遍历字符串到尾部,然后首指针和尾指针对应的字符互换。   注意尾部空指针的处理。

void reverse(char* str) {
	char temp, *end = str;
	if(str) 
	{
		while(*end)
		{
			++end;
		}
		//end指针指向字符串尾部的空指针,自减一用来指向最后一个字符。
		--end;
		while(str < end) 
		{
			temp = *str;
			*str++ = *end;
			*end-- = temp;
			//++str; --end;
		}
	}
}

(3)给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另外一个字符串。

算法:本题假定区分字符串的大小写并考虑空白情况。即“god  ”不是“dog”的重新排列(变位词)。易知当两字符串长度不同时肯定不是变位词。

方法一:排序字符串

方法二:检查两字符串的各字符数是否相同

点赞