题目一:实现一个算法,确定一个字符串的所有字符是否全都不同(有没有重复字符)。
代码:
1 public class Different { 2 3 static boolean checkDifferent(String iniString){ 4 if (iniString.isEmpty()) { 5 return true; 6 } 7 int []flag = new int[128]; 8 // 扫描字符串 9 for (int i = 0; i < iniString.length(); i++) { 10 int c = iniString.charAt(i); 11 if (flag[c]>0) { 12 return false; 13 }else { 14 flag[c]++; 15 } 16 } 17 return true; 18 } 19 20 public static void main(String[] args) { 21 String iniString = "Abcdefga"; 22 System.out.println(checkDifferent(iniString)); 23 } 24 25 }
题目二:请实现一个算法,翻转一个给定的字符串。
代码:
1 public class ReverseString { 2 3 /** 4 * 解法一 5 */ 6 public static String reverseString(String iniString){ 7 int len = iniString.length(); 8 char[] charArr = new char[len]; 9 for (int i = 0; i < charArr.length; i++) { 10 charArr[i] = iniString.charAt(len-1-i); 11 } 12 return new String(charArr); 13 } 14 15 /** 16 * 解法二 17 */ 18 public static String reverseString_1 (String iniString){ 19 // StringBuilder sBuilder = new StringBuilder(iniString) // 和StringBuffer效果差不多。 20 StringBuffer sBuffer = new StringBuffer(iniString); 21 return sBuffer.reverse().toString(); 22 } 23 24 public static void main(String[] args) { 25 26 } 27 28 }
题目三:变形词问题。给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
代码:
1 import java.util.Arrays; 2 3 /* 4 变形词:两个串有相同的字符及数量组成 abc abc ,abc cba,aabcd bcada; 5 给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 6 * 这里规定大小写为不同字符,且考虑字符串中的空格。保证两串的长度都小于等于5000。 7 测试样例: 8 "Here you are","Are you here" 9 返回:false 10 */ 11 public class Same { 12 13 public static void main(String[] args) { 14 String A = "abcdd"; 15 String B = "cbaddd"; 16 System.out.println("解法一:"+checkSam_1(A, B)); 17 System.out.println("解法二:"+checkSam_2(A, B)); 18 } 19 20 /** 21 * 解法一、时间复杂度为O(NlgN) 22 */ 23 public static boolean checkSam_1(String stringA, String stringB) { 24 int len1 = stringA.length(); 25 int len2 = stringB.length(); 26 if (len1 != len2) { 27 return false; 28 } 29 // 转成字符数组 30 char[] arr1 = stringA.toCharArray(); 31 char[] arr2 = stringB.toCharArray(); 32 // 对它们排序 33 Arrays.sort(arr1); 34 Arrays.sort(arr2); 35 36 return Arrays.equals(arr1, arr2); 37 } 38 39 /** 40 * 解法二、时间复杂度为 O(N) 41 */ 42 static boolean checkSam_2(String stringA,String stringB){ 43 int []helper = new int[128]; // 这里有一个巧妙解法 只用一个辅助空间 44 char[] charArrA = stringA.toCharArray(); 45 char[] charArrB = stringB.toCharArray(); 46 for (int i = 0; i < charArrA.length; i++) { 47 helper[charArrA[i]]++; 48 } 49 for (int i = 0; i < charArrB.length; i++) { 50 helper[charArrB[i]]--; 51 if (helper[charArrB[i]]<0) { // B 比 A 多 在辅助空间相同位置上 52 return false; 53 } 54 } 55 for (int i = 0; i < helper.length; i++) { 56 if(helper[i]>0){ // A 比 B 多 在辅助空间相同位置上 57 return false; 58 } 59 } 60 return true; 61 } 62 63 }
题目四:替换字符串中的空格。请编写一个方法,将字符串中的空格全部替换为“%20”,给定一个String iniString 为原始的串,以及串的长度 int len, 返回替换后的string。
代码:
1 /** 2 *测试样例: 3 "Mr John Smith",13 返回:"Mr%20John%20Smith" 4 "Hello World",12 返回:”Hello%20%20World” 5 */ 6 public class Replacement { 7 8 public static void main(String[] args) { 9 System.out.println("解法一:"+replaceSpace("Mr John Smith", 13)); 10 System.out.println("解法二:"+replaceSpace("Mr John Smith000000000000000000000".toCharArray(), 13)); 11 } 12 13 public static String replaceSpace(String iniString, int length) { 14 return iniString.replaceAll("\\s", "%20"); 15 } 16 17 static String replaceSpace(char[] iniString,int length){ 18 int count = length; 19 for (int i = 0; i <length; i++) { 20 if (iniString[i]==' ') { 21 count += 2; 22 } 23 } 24 int p1 = length -1; 25 int p2 = count -1; 26 while(p1>=0){ 27 if (iniString[p1]==' ') { 28 iniString[p2--] = '0'; 29 iniString[p2--] = '2'; 30 iniString[p2--] = '%'; 31 }else { 32 iniString[p2--] = iniString[p1]; 33 } 34 p1--; 35 } 36 return new String(iniString, 0, count); 37 } 38 }