字符串子串操作

目录

题目描述:

例子:

输入描述:

输出描述:

我自己的代码

从中得到的收获

1.Map如何按照value进行排序

思路:

2.TreeSet有个函数descendingSet(),可以实现TreeSet中元素降序存放

3. 数组arr[i++]、arr[++i]的区别


题目描述:

找出字符串(全部都是小写的英文字母)中的重叠子串,计算各个字母对应的重叠子串的长度之和,并按照出现次数从大到小进行输出:

例子:

字符串:

aaabcccaddfffaa

其中,字符a的重叠子串包含 aaa aa

其中,字符c的重叠子串包括 ccc

其中,字符d的重叠子串包括 dd

其中,字符f的重叠子串包括 fff

那么,最终的输出结果就是:

a:5
c:3
f:3
d:2

输入描述:

一行字符串,其中可能包括若干个重叠子串,如:

aaabcccaddfffaa

输出描述:

重叠的字母为key,字母个数为value,中间用冒号连接,并按照长度之和从大到小输出,样例如下:

a:5
c:3
f:3
d:2

我自己的代码

import java.util.*;
import java.io.*;

public class One {
	public static void main(String[] args) throws Exception {
		BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
		String[] readStr = bfr.readLine().split("");
		int readStrLen = readStr.length;

		HashMap strArr = new HashMap();

		for (int i = 0; i < readStrLen - 1;) {
			String one = readStr[i];
			String two = readStr[++i];

			if (one.equals(two)) {
				// 如果第一个和第二个字符相同,则此时该重叠子串长度为2
				int tem = 2;
				// 接着比较下一个字符,直到整个字符串结尾
				while (i < readStrLen - 1) {
					// 取下一个字符
					String temI = readStr[++i];
					// 如果下一个字符和该重叠子串的字符相同
					// 则,该重叠子串的长度加一
					// 否则,说明重叠子串已经结束,停止遍历
					if (!two.equals(temI)) {
						break;
					}
					tem++;
				}

				/* =====把重叠子串的字符和长度分别添加为Map的key和value===== */
				if (strArr.containsKey(one)) {
					strArr.put(one, strArr.get(one) + tem);
				} else {
					strArr.put(one, tem);
				}
			}
		}
		// 按要求格式打印输出结果,即按重叠子串长度累加和,降序排列
		sortMapValue(strArr);
	}

	/*
	 * 输入格式:HashMap 功能:按重叠子串长度累加和,降序排列
	 * 思路:首次,把输入的value作为TreeMap>的key,
	 * 		 因为value可能存在重复的,所以,选择TreeSet存放输入的key, 
	 * 		 然后,在打印输出的时候,先遍历键值,存入到TreeSet中,
	 * 		使用TreeSet的descendingSet()函数,进行降序排列,
	 * 		最后,遍历降序后的TreeSet,完成降序输出。 
	 * 
	 */
	public static void sortMapValue(HashMap origMap) {

		/* ====================转换原始的键、值,重新存入新Map==================== */

		// 用来存放原始的值和键
		TreeMap> valueKeyMap = new TreeMap<>();
		TreeSet keySort;
		for (String origKey : origMap.keySet()) {
			// 原始的值
			Integer value = origMap.get(origKey);
			if (valueKeyMap.containsKey(value)) {
				valueKeyMap.get(value).add(origKey);
			} else {
				keySort = new TreeSet<>();
				keySort.add(origKey);

				valueKeyMap.put(value, keySort);
			}
		}

		/* ====================打印输出==================== */
		TreeSet values = new TreeSet<>();
		for (int value : valueKeyMap.keySet()) {
			values.add(value);
		}

		for (int value : values.descendingSet()) {
			TreeSet origKeys = valueKeyMap.get(value);
			for (String origKey : origKeys) {
				System.out.println(origKey + ":" + value);
			}
		}

	}

}

从中得到的收获

1.Map如何按照value进行排序

思路:

首先,把value存放到TreeSet中,把key存放到TreeMap>的ArrayList中,因为key对应的value可能有相同的,所以把value作为键时,对应的value获取到的键值可能相同,所以用ArrayList存放,其次,利用descending()函数让TreeSet中的元素降序排列,最后,遍历TreeSet(),得到降序排列的结果。

2.TreeSet有个函数descendingSet(),可以实现TreeSet中元素降序存放

3. 数组arr[i++]、arr[++i]的区别

 

你可能感兴趣的:(互联网笔试算法题)