欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【华为】2019校招(字符串解压缩,26进制和10进制相互转换)

程序员文章站 2022-03-14 10:01:03
...

字符串解压缩,a11b2bac3bad3abcd2,按照数量由少到多的顺序,数量相等的按照字典序,输出

ccccbbbbbdddddaaaaaaaaaaaaaa

竟然自己做了两个小时,加快编程速度,一定加快速度,注重准确性,正式笔试没有时间调试。

开始用i,j指针遍历找到字符和它的出现次数,用hashmap去重复,排序时用sort方法的重写Comparator接口

编写的比较麻烦,list-map-list的倒来倒去,磨磨唧唧

public static void reOrder() {
		String temp = "a11b2bac3bad3abcd2";
		// String temp="cd2";
		List<character> list = new ArrayList<>();
		int i = 0, j = 0;
		while (i < temp.length()) {
			if (temp.charAt(i) >= 'a' && temp.charAt(i) <= 'z') {
				character c = new character();
				c.chara = temp.charAt(i);
				j++;
				// 下一位还是字符不是数字,证明只有一个
				if (j < temp.length() && temp.charAt(j) >= 'a' && temp.charAt(j) <= 'z') {
					c.count = 1;
					list.add(c);
					i = j;
				} else {
					// 下一位是数字,但是不知道几位数字
					i = j;// 标记数字开始
					while (j < temp.length() && !(temp.charAt(j) >= 'a' && temp.charAt(j) <= 'z')) {
						j++;
					}
					j = j - 1;// 多加了一次
					int ten = 1;
					for (int index = j; index >= i; index--) {
						c.count += (temp.charAt(index) - '0') * ten;
						ten = ten * 10;
					}
					list.add(c);
					i = j + 1;
					j = i;
				}
			} else {

			}
		}
		HashMap<Character, Integer> map = new HashMap<>();
		// 用hashmap去重复合并
		for (i = 0; i < list.size(); i++) {
			if (map.containsKey(list.get(i).chara)) {
				map.put(list.get(i).chara, map.get(list.get(i).chara) + list.get(i).count);
			} else {
				map.put(list.get(i).chara, list.get(i).count);
			}
		}
		//加到list中方便排序
		List<character> list1 = new ArrayList();
		for (Entry<Character, Integer> entry : map.entrySet()) {
			list1.add(new character(entry.getKey(), entry.getValue()));
		}
		Collections.sort(list1, new Comparator<character>() {

			@Override
			public int compare(character o1, character o2) {
				// TODO Auto-generated method stub
				if (o1.count > o2.count) {
					return 1;
				} else if (o1.count < o2.count) {
					return -1;
				} else {
					// 数目相等字典序
					if (o1.chara > o2.chara) {
						return 1;
					} else if (o1.chara < o2.chara) {
						return -1;
					}
				}
				return 0;
			}
		});

		//测试输出
//		for (i = 0; i < list1.size(); i++) {
//			System.out.println(list1.get(i).chara + " " + list1.get(i).count);
//		}
		// 合并输出
		StringBuffer string = new StringBuffer("");
		for (i = 0; i < list1.size(); i++) {
			for (j = 0; j < list1.get(i).count; j++) {
				string.append(list1.get(i).chara);
			}
		}
		System.out.println(string.toString());
	}

 

26进制和10进制相互转换

public static String ToNumberSystem26(int n) {
		String s = "";
		while (n > 0) {
			int m = n % 26;
			s = (char) (m + 97) + s;
			if (m == 0) {
				m = 26;
			}
			n = (n - m) / 26;
		}
		return s;
	}

	public static int FromNumberSystem26(String s) {
		if (s == null)
			return 0;
		int n = 0;
		char[] arr = s.toCharArray();
		for (int i = s.length() - 1, j = 1; i >= 0; i--, j = j * 26) {
			char c = arr[i];
			n += ((int) (c - 97)) * j;
		}
		return n;
	}