Java面试宝典——如何删除字符串中重复的字符 + 统计字符串中单词个数

package string.demos;

import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;

/** 
 * @author wyl
 * @time 2018年7月9日上午10:15:59
 * 删除字符串中重复的字符
 * 方法:
 * ①“蛮力”法
 * 		把字符串看成一个字符数组,对该数组使用双重遍历,
 * 		如果发现重复字符,置为 \0;
 * 		再把 \0字符去掉
 * ②HashTable  ③set集合
 */
public class Test3 {

	public static String removeDup(String s){
		char[] cs=s.toCharArray();
		for(int i=0;i<cs.length;i++){
			if (cs[i]=='\0') {
				continue;
			}
			for(int j=i+1;j<cs.length;j++){
				if (cs[j]=='\0') {
					continue;
				}
				//把重复字符置为  \0
				if (cs[i]==cs[j]) {
					cs[j]='\0';
				}
			}
		}
		
		int m=0;
		//去掉 \0
		for(int i=0;i<cs.length;i++){
			if (cs[i]!='\0') {
				cs[m++]=cs[i];
			}
		}
		return new String(cs,0,m);
	}
	
	public static String removeDup2(String s){
		char[] cs=s.toCharArray();
		String res="";
		Hashtable<Character, Integer> table=new Hashtable<>();
		for(int i=0;i<cs.length;i++){
			if (table.containsKey(cs[i])) {
				continue;
			}else {
				table.put(cs[i], 1);
				continue;
			}
		}
		for(Iterator<Character> it=table.keySet().iterator();it.hasNext();){
			Character key=it.next();
			res+=key;
		}
		return res;
	}
	
	
	public static String removeDup3(String s){
		char[] cs=s.toCharArray();
		String res="";
		Set<Character> set=new HashSet<>();
		for(int i=0;i<cs.length;i++){
			set.add(cs[i]);
		}
		//遍历set集合
		Iterator<Character> iterator=set.iterator();
		while(iterator.hasNext()){
			res+=iterator.next();
		}
		return res;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("方法一");
		String str="abcaabcd";
		str=removeDup(str);
		System.out.println(str);
		
		System.out.println("方法二");
		String str2="abcaabcd";
		str2=removeDup2(str2);
		System.out.println(str2);
		
		System.out.println("方法三");
		String str3="abcaabcd";
		str3=removeDup3(str3);
		System.out.println(str3);
	}

}
结果:
方法一
abcd
方法二
badc
方法三
abcd
方法二,得出的结果与方法一不同~~?????


统计一行字符串中有多少个单词?

字符串分割成字符数组;
对每个数组计算长度,若长度≠0,则为单词


package string.demos;
/** 
 * @author wyl
 * @time 2018年7月9日上午10:50:28
 */
public class Test4 {

	public static int countWords(String s){
		String[] ss=s.split(" ");
		int cnt=0;
		for(int i=0;i<ss.length;i++){
			if (ss[i].length()!=0) {
				cnt++;
			}
		}
		return cnt;
	}
	
	/**
	 * 单词的数目可以由空格出现的次数决定(连续的若干个空格作为一次空格;一行开头的空格不统计在内)。
	 * 若测出某一个字符为非空格,而它前面的字符为空格。则表示新的单词开始了,此时count+1;
	 * 若当前字符为非空格而其前面的字符也是非空格,则意味着仍是原来那个单词的继续,count不加1
	 * 前面一个字符是否空格可以从word的值看出来,若word==0,则表示前一个字符是空格;否则,为非空格。
	 * @param s
	 * @return
	 */
	public static int countWords2(String s){
		int word=0;
		int count=0;
		for(int i=0;i<s.length();i++){
			if (s.charAt(i)==' ') {
				word=0;
			}else if (word==0) {
				word=1;
				count++;
			}
		}
		return count;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String s="a am ok  hh  ";
		System.out.println(s);
		System.out.println("方法一:"+Test4.countWords(s));
		System.out.println("方法二:"+Test4.countWords2(s));
	}

}



猜你喜欢

转载自blog.csdn.net/u014067137/article/details/80966841