알고리즘 과 데이터 구조 면접 문제 (21) - 한 문자열 에서 첫 번 째 로 한 번 만 나타 나 는 문 자 를 찾 습 니 다.

제목.
                    。   abaccdeff,   b。

문제 풀이 의 사고 방향.
지난 문 제 는 문자열 에 있 는 각 문자 의 개 수 를 구 하 는 것 이 었 습 니 다. 사실은 대동소이 합 니 다. 이 문 제 는 지난 문제 보다 더 간단 합 니 다. 첫 번 째 1 을 얻 으 면 끝 납 니 다.비교적 쉽다.하지만 이전 코드 를 개조 해 야 합 니 다.
public class CharCount {

	public void count(String str) {
		if (str == null || str.length() == 0) {
			return;
		}
		StringBuilder builder = new StringBuilder(str.length());
		isContainsChar(str, str.length(), builder);
		if (builder.length() == 0) {
			System.out.println("     ");
			return;
		}
		//   hashmap          ,      O(n)
		Map<Character, Integer> countMap = new LinkedHashMap<Character, Integer>();
		for (int i = 0; i < builder.length(); i++) {
			Character c = builder.charAt(i);
			if (countMap.containsKey(c)) {
				int num = countMap.get(c);
				countMap.put(c, ++num);
			} else {
				countMap.put(c, 1);
			}
		}

		System.out.println("    : " + builder);
		printCountInfo(countMap);
		//   map
		if (!countMap.containsValue(1)) {
			System.out.println("                ");
			return;
		}
		Set<Map.Entry<Character, Integer>> set = countMap.entrySet();
		Iterator<Entry<Character, Integer>> iterator = set.iterator();
		while (iterator.hasNext()) {
			Entry<Character, Integer> entry = iterator.next();
			if (entry.getValue() == 1) {
				System.out.println("              : "
						+ entry.getKey());
				return;
			}
		}

	}

	private void isContainsChar(String str, int length, StringBuilder builder) {
		str = str.toLowerCase();
		Pattern pattern = Pattern.compile("[a-z]+");
		Matcher matcher = pattern.matcher(str);
		int k = 0;
		while (k < length) {
			if (matcher.find()) {
				builder.append(matcher.group());
				if (matcher.end() == length) {
					// System.out.println("over");
					break;
				}
			}
			k++;
		}
	}

	private void printCountInfo(Map<Character, Integer> map) {
		if (!map.isEmpty()) {
			Set<Entry<Character, Integer>> set = map.entrySet();
			Iterator<Entry<Character, Integer>> iter = set.iterator();
			while (iter.hasNext()) {
				Entry<Character, Integer> entry = iter.next();
				System.out.println(String.format("%c : %d", entry.getKey(),
						entry.getValue()));
			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] strArray = { "123456",//         ,      
				"“   $@!-=)(&^%#@!",//         ,        
				"asdfsewrewe",//          
				"ASDFDSFWEGSDFSD",//          
				"12324aasdfds",//                
				"12324ASDFDSFWEGSDFSD",//                
				"aasdfdsASDFDSFWEGSDFSD",//             
				"aasdfdsASDFDSFWEGSDFSD“   $@!-=)(&^%#@!",//     、           
				null,//          
				""//         0   
		};
		CharCount charCount = new CharCount();
		for (String str : strArray) {
			System.out.println(String.format("    %s       :", str));
			charCount.count(str);
			System.out.println("=================================");
		}

	}
}

실행 프로그램 출력 결과
    123456       :
     
=================================
    “   $@!-=)(&^%#@!       :
     
=================================
    asdfsewrewe       :
    : asdfsewrewe
a : 1
s : 2
d : 1
f : 1
e : 3
w : 2
r : 1
              : a
=================================
    ASDFDSFWEGSDFSD       :
    : asdfdsfwegsdfsd
a : 1
s : 4
d : 4
f : 3
w : 1
e : 1
g : 1
              : a
=================================
    12324aasdfds       :
    : aasdfds
a : 2
s : 2
d : 2
f : 1
              : f
=================================
    12324ASDFDSFWEGSDFSD       :
    : asdfdsfwegsdfsd
a : 1
s : 4
d : 4
f : 3
w : 1
e : 1
g : 1
              : a
=================================
    aasdfdsASDFDSFWEGSDFSD       :
    : aasdfdsasdfdsfwegsdfsd
a : 3
s : 6
d : 6
f : 4
w : 1
e : 1
g : 1
              : w
=================================
    aasdfdsASDFDSFWEGSDFSD“   $@!-=)(&^%#@!       :
    : aasdfdsasdfdsfwegsdfsd
a : 3
s : 6
d : 6
f : 4
w : 1
e : 1
g : 1
              : w
=================================
    null       :
=================================
           :
=================================

좋은 웹페이지 즐겨찾기