1.实现一个算法 确定一个字符串的所有字符是否所有不同。如果不同意使用额外的数据结构,又应该怎么做呢?
首先应该问清楚使用ASCII还是Unicode字符串。
如果为前者,如果字符串的长度大于256,则返回0,第一种思路就是构建一个布尔型的数组,
索引值i表示该字符串是否含有字母表的第i个字符。若字符第二次出现,则为假。
bool isUniqueChar(string str) { if(str.length() > 256) return false; bool *char_set = new bool[256]; for(int i = 0;i<str.length();i++) { int val = static_cast<int>(str[i]); if(char_set[val]) return false; char_set[val] = true; } return true; }
使用位向量,但是把空间缩短为原来的八分之中的一个。
此外还有两种方法可使用,
1)把字符串中的每个字符与其它字符比較,时间复杂度是O(n2),空间复杂度是O(1)。
2)假设同意改动字符串,在可先排序,然后检查有无相邻字符同样来推断。
2.实现void reverse(char * str)函数,实现一个NULL结尾的字符串反转。
不应该忽略的是:不分配额外空间,直接就地反转,另外,还要注意NULL字符。 void reverse(char *str) { char * end = str; char temp; if(str) { while(*end) end++; --end;//最后一个是NULL因此要回退一个字符。 while(str < end) { temp = *str; *str = *end; *end = temp; } } }
3.给定两个字符串,请编敲代码,确定当中一个字符串的字符又一次排列后,是否能变成另外一个字符串。
首先应该确认的是变位词是否区分大写和小写,还有空格是否考虑在内。
当然,假设两个字符串的长度不同,一定是不同的。
第一种方法我们考虑,排序字符串。在某种程度上,这个算法不算是最优,只是换个角度看,
这个算法也许更可取,由于它:清晰、简单、易懂。从实践的角度来看,这可能是解决问题的上佳之选。
只是,要是效率当头,我们能够换种做法。
方法2:检查两个字符串的各字符数是否同样。
bool permutation(string s,string t) { if(s.length != t.length()) return false; int *letters = new [256]; for(int i = 0;i<256;i++) letters[i] = 0; for(int i = 0;i<s.length();i++) { int pos = (int)s[i]; letters[pos]++; } for(int i = 0;i<t.length();i++) { int pos = (int)t[i]; if(--letters[pos] < 0) return false; } return true; }
4.编写一个算法,把字符串中的空格所有替换为“%20”。假定该字符串尾部有足够的空间存放新增字符,而且知道字符出串的"真实"长度。
在处理字符串的时候,应该考虑从字符串的尾部编辑,从后向前反向操作。这样的方法非常实用。
由于字符串尾部有额外的缓冲,能够直接改动,不用操心覆盖原有数据。
我们採用上面的做法,这样会有两次的扫描。第一次确定有多少空格,我们就知道,从什么位置開始复写。
第二次開始反向编辑字符串,检測到有空格之后将%20复写到下一个位置。若不是空白就复制原来的字符。
由于字符串尾部有额外的缓冲,能够直接改动,不用操心覆盖原有数据。
我们採用上面的做法,这样会有两次的扫描。第一次确定有多少空格,我们就知道,从什么位置開始复写。
第二次開始反向编辑字符串,检測到有空格之后将%20复写到下一个位置。若不是空白就复制原来的字符。
void replaceSpace(char str[],int length) { int spaceCount = 0,newLength,i; for(i = 0;i<length;i++) { if(str[i] == ' ') spaceCount++; } newLength = length + spaceCount*2; str[newLength] = '