程序员面试金典1.1:确定字符串的所有字符是否全都不同
2015-08-25 21:14
369 查看
1.1 实现一个算法,确定一个字符串的所有字符是否全都不同。假设不允许使用额外的数据结构,又该如何处理?
解法:
一开始,不妨先问问面试官,上面的字符串是ASCII字符串还是Unicode字符串。这很重要,问这个 问题表明你关注细节,并且对计算机科学有深刻的了解。
为了简单起见,这里假设字符集为ASCII。若不是的话需要扩大存储空间,不过其余逻辑没有分别。
假设字符集为ASCII,对于这个问题,我们可以做一个简单的优化,若字符串的长度大于字母表中的字符的个数,则直接返回false。毕竟,若字母表只有256个字符。字符串里就不可能有280个各不相同的字符。
第一种解法是构建一个布尔值的数组,索引值i对应的标记指示该字符串是否含有字母表第i个字符。若这个字符第二次出现,则立即返回false。
下面是这个算法的实现代码:
使用位向量(bit vector),可以将空间占用减少为原先的1/8 。下面的代码假定字符串只含有小写字母a到z.这样一来,我们只需要使用一个int型的变量:
(1):将字符串中的每一个字符与其余的字符进行比较。这种算法的时间复杂度为O(n2),空间复杂度为O(1).
(2):若允许修改输入字符串,可以在O(nlogn)时间里对字符串排序,然后线性检查其中有无相邻的完全相同的字符相同 的情况。不过,值得注意的是,很多排序算法会占用额外的空间。
从某些方面来看,这些算法并不是最优,不过,从问题的限制条件来看,或许还算是不错的解法。
解法:
一开始,不妨先问问面试官,上面的字符串是ASCII字符串还是Unicode字符串。这很重要,问这个 问题表明你关注细节,并且对计算机科学有深刻的了解。
为了简单起见,这里假设字符集为ASCII。若不是的话需要扩大存储空间,不过其余逻辑没有分别。
假设字符集为ASCII,对于这个问题,我们可以做一个简单的优化,若字符串的长度大于字母表中的字符的个数,则直接返回false。毕竟,若字母表只有256个字符。字符串里就不可能有280个各不相同的字符。
第一种解法是构建一个布尔值的数组,索引值i对应的标记指示该字符串是否含有字母表第i个字符。若这个字符第二次出现,则立即返回false。
下面是这个算法的实现代码:
public boolean isUniqueChar2(String str){ if(str.length() > 256) return false; boolean[] char_set = new boolean[256]; for(int i = 0;i<str.length();i++){ int val = str.charAt(i); if(char_set[val]){ //如果这个字符已在字符串中出现过 return false; } char_set[val] = true; } return true; }这段代码的时间复杂度为O(n),其中n为字符串长度。空间复杂度为O(1).
使用位向量(bit vector),可以将空间占用减少为原先的1/8 。下面的代码假定字符串只含有小写字母a到z.这样一来,我们只需要使用一个int型的变量:
public boolean isUniqueChar(String str){ if(str.length() > 256) return false; int checker = 0; for(int i = 0 ; i<str.length();i++){ int val = str.charAt(i) - 'a'; if((checker & (1 << val)) > 0 ){ return false; } checker |= (1 << val); } return true; }另外还有两种解法:
(1):将字符串中的每一个字符与其余的字符进行比较。这种算法的时间复杂度为O(n2),空间复杂度为O(1).
(2):若允许修改输入字符串,可以在O(nlogn)时间里对字符串排序,然后线性检查其中有无相邻的完全相同的字符相同 的情况。不过,值得注意的是,很多排序算法会占用额外的空间。
从某些方面来看,这些算法并不是最优,不过,从问题的限制条件来看,或许还算是不错的解法。
相关文章推荐
- 黑马程序员-OC-继承
- 进职场记(二)-培训
- 剑指offer_面试题11 数值的整数次方_考察代码的完整性
- 剑指offer面试题java实现之题7:用两个栈模拟一个队列的入队和出队操作
- 黑马程序员-OC-getter & Setter方法
- 黑马程序员-OC-类方法和对象方法的调用
- 阿里巴巴常考面试题及汇总答案
- 剑指offer面试题java实现之题6:重建二叉树
- 黑马程序员-C-十进制正数以二进制输出
- 黑马程序员-C-二维数组&指针数组&二维数组指针
- 黑马程序员-C-for语句
- 黑马程序员-C-switch语句
- JAVA常见面试题
- 格灵深瞳面试--我和Yoshua Bengio的距离
- 一些面试题目
- 百度前端面试总结
- The Log:每个程序员都应该知道有关实时数据的统一抽象(1)概念
- 给你一次机会面试架构师 你会问什么问题?
- 黑马程序员—— Java 基础 面向对象之继承 (复习)
- 面试题总结(三)、《STL源码剖析》相关面试题总结