您的位置:首页 > 职场人生

程序员面试金典(三)--数组和字符串

2016-06-13 16:40 288 查看

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

对于这样的题目,首先要考虑字符串的编码方式,是Unicode还是ASCⅡ。假设使用ASCⅡ,有256个字符。

下面是具体的代码实现:

package com.czl.question;

public class TestStr {
public boolean isUniqueChars(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]) {//如果这个字符已经出现过,返回false
System.out.println("有重复");
return false;
}
char_set[val] = true;
}
System.out.println("没有重复");
return true;
}
public static void main(String[] args) {
String string = "14124235qwertymdaldnmzd";
TestStr testStr = new TestStr();
testStr.isUniqueChars(string);
}
}


此种解法的时间复杂度为O(n)O(n),其中nn为字符串长度,空间复杂度为O(1)O(1)。

如果,将字符串中的每一个字符与其余字符进行比较,不需要考虑字符类型,这种方法的时间复杂度为O(n2)O(n^2),空间复杂度为O(1)O(1)。

package com.czl.question;

public class TestUniqueStr {

public boolean isUnique(String str){
char[] tempchar = str.toString().toCharArray();

for (int i = 0; i < tempchar.length; i++) {
for (int j = i + 1; j < tempchar.length; j++) {
if (tempchar[i] == tempchar[j]) {

System.out.println("有重复");
return false;
}
System.out.println("没有重复");
return true;
}
}
return true;
}

public static void main(String[] args) {
String string = "qwerabc";
TestUniqueStr tus = new TestUniqueStr();
tus.isUnique(string);

}
}


题目2:给定两个字符串,请编写程序,确实其中一个字符串的字符重新排列后,能否变成另一个字符串。

分析:首先,针对变位词比较是否区分大小写,一般字符串中存在的空格是否需要考虑,比较两个字符串时,只要两者长度不同,就不是变位词。


解法一:排序字符串

若两个字符串互为变位词,那么他们拥有同一组字符,自不过顺序不同。因此,对字符串排序,组成两个变位词的字符就会有相同的顺序,比较排序后的字符串即可。

public class Question2 {
public String sort(String s){
char[] content = s.toString().toCharArray();
java.util.Arrays.sort(content);
return new String(content);
}
public boolean permutation(String s,String t){
if (s.length() != t.length()) {
return false;
}
return sort(s).equals(sort(t));
}
public static void main(String[] args) {
Question2 q = new Question2();
String s = "goodod";
String t = "doodog";

System.out.println(q.permutation(s, t));
}
}


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

根据变位词的定义,可以知道组成两个变位词的字符数相同。只需要遍历字母表,计算每个字符出现的次数,然后比较两个数组即可。

public class Question2_1 {
public boolean permutation(String s,String t){
if (s.length() != t.length()) {
return false;
}

int[] letters = new int[256];//假设条件
char[] char_set = s.toString().toCharArray();
for (char c : char_set) {//计算字符串s中每个字符出现的次数
letters[c]++;
}

for (int i = 0; i < t.length(); i++) {
int c = (int)t.charAt(i);
if (--letters[c] < 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
Question2_1 q = new Question2_1();
String s = "goodmoon";
String t = "noom!doog";
String t1 = "nooomdog";

System.out.println(q.permutation(s, t));
System.out.println(q.permutation(s, t1));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: