直接上代码,所有注释都在解释问题和编程步骤。
StringUtils.java是我封装的工具类。
package com.strings;
public class StringUtils {
private StringUtils() {
}
/**
* 完成字符数组的翻转
*
* @param cArr
* :用来翻转的字符数组
* @param begin
* :翻转的开始位置
* @param end
* :翻转的结束位置
*/
public static void swap(char[] cArr, int begin, int end) {
while (begin < end) {
char tmp = cArr[begin];
cArr[begin] = cArr[end];
cArr[end] = tmp;
begin++;
end--;
}
}
/**
* @param str
* 需要翻转的字符串
*
* @return 返回翻转后的字符串
*/
public static String swapString(String str) {
char a[] = str.toCharArray();
swap(a, 0, a.length - 1);
int index = 0;// 用来记录每次需要翻转子字符串的开始
for (int i = 1; i < a.length; i++) {
if (a[i] == ' ') {// 使用 ' '判断单个字符串的结束
swap(a, index, i - 1);
index = i + 1;
}
}
swap(a, index, a.length - 1);// 最后一个子字符串只能单独翻转
return new String(a);
}
/**
* 判断两个字符串是否由相同的字符组成
*
* @param s1
* @param s2
* @return
*/
public static boolean compare(String s1, String s2) {
char s1Arr[] = s1.toCharArray();
char s2Arr[] = s2.toCharArray();
int[] bCount = new int[256];
for (int i = 0; i < bCount.length; i++) {
bCount[i] = 0;
}
for (int i = 0; i < s1Arr.length; i++) {
bCount[s1Arr[i] - '0']++;
}
for (int i = 0; i < s2Arr.length; i++) {
bCount[s2Arr[i] - '0']--;
}
for (int i = 0; i < bCount.length; i++) {
if (bCount[i] != 0) {
return false;
}
}
return true;
}
/**
* 如何刪除字符串中重复的字符
*
* @param str
* @return
*/
public static String deleteRepeatString(String str) {
char cStr[] = str.toCharArray();
int bCount[] = new int[256];
for (int i = 0; i < bCount.length; i++) {
bCount[i] = 0;
}
for (int i = 0; i < cStr.length; i++) {
if (bCount[cStr[i] - '0'] == 0) {// 如果出现的次数为0,则代表第一次遇到这个字符
bCount[cStr[i] - '0'] = 1;// 次数加1代表,记录该字符已经出现
} else {
cStr[i] = '\0';// 如果该字符已经出现过,则把该字符变成 '\0'
}
}
// 去掉cStr数组中的\0元素
int index = 0;
for (int i = 0; i < cStr.length; i++) {
if (cStr[i] != '\0') {
cStr[index++] = cStr[i];
}
}
return new String(cStr, 0, index);
}
/**
* 如何统计一行字符串中的单词个数
*
* @param str
* @return
*/
public static int getWordCountOfString(String str) {
String trimStr = str.trim();//去掉字符串前后的空格
return trimStr.split(" ").length;
}
}
Main.java是测试代码。
package com.strings;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// 把how are you字符串变成you are how
// 思路:把整体翻转(uoy era woh),然后单个翻转(you are how)
String reversalStr = "how are you";
System.out.println("翻转前:" + reversalStr);
System.out.println("翻转后:" + StringUtils.swapString(reversalStr));
// 判断两个字符串是否由相同的字符组成
// 相等的意思:组成字符串的字符以及各字符的个数是一样的
// 思路:由于ASCII字符只有256个,对应编码0-255,于是可以申请大小为256的字符数组来记录字符出现的个数,并初始化为0.
// 然后遍历第一个字符串的时候,将ASCII码作为下标,把对应数组值加1,然后遍历第二个字符串把对应元素减1,判断这个数组
// 最后是否是全0
String equalStr1 = "aaaabbc";
String equalStr2 = "abcbaaa";
System.out.println("\n" + equalStr1 + " 和 " + equalStr2 + " 是否由相同字符組成:"
+ StringUtils.compare(equalStr1, equalStr2));
// 如何刪除字符串中重复的字符
// 思路:由于ASCII字符只有256个,对应编码0-255,于是可以申请大小为256的字符数组来记录字符出现的个数,并初始化为0.
// 把字符的编码作为数组的下标,
String repeatStr = "abcdabcd";
System.out.println("\n" + repeatStr + " 去掉重复元素以后:"
+ StringUtils.deleteRepeatString(repeatStr));
// 如何统计一行字符串中的单词个数
// 思路:空格出现的次数决定单词的数量
String wordCountStr = "I am hehao";
System.out.println("\n" + wordCountStr + " 单词个数为:"
+ StringUtils.getWordCountOfString(wordCountStr));
}
}
还有两个打印数组的排列情况和字符串的所有组合。还没有想明白。