求字符串第一个非重复字符+首尾相连数数字依次remove

1.给定一个字符串,求第一个不重复的字符,如: abbcad -> c

我最开始想到的就是使用LinkedHashMap<Character,Integar>,一个保存了键值对放入顺序的HashMap。遍历字符串,当map中有该字符时其value加一,没有则放入(char,1)。而后遍历map的key集合,找出第一个值为1的即可。

    public  char a(String s){
		LinkedHashMap<Character, Integer> map=new LinkedHashMap<>();
		for(int i=0;i<s.length();i++){
			char c=s.charAt(i);
			if (map.get(c)!=null) {
				Integer in=map.get(c);
				map.put(c, ++in);
			} else {
				map.put(c, 1);
			}
		}
		Set<Character> result=map.keySet();
		Iterator<Character> iterator=result.iterator();
		char x=iterator.next();
		while (map.get(x)>1) {
			x=iterator.next();
		}
		return x;
	}

用两个数组来做也可以,不过效率应该是比不上HashMap的O(1)的查询。


2.标号1-n的n个人首尾相接,1到3报数,报到3的退出,求最后一个人的标号

思路是这样的,首先删除集合中所有报数为3的元素,然后对新的集合再进行相同操作,不过要用到上一轮的余数,想象把上一轮没数完的元素拼在开头然后计算集合中所有报数为3的元素并删除。这样循环直到只剩2个元素。

    public int b(int n){
		LinkedList<Integer> list=new LinkedList<>();
		for (int i = 1; i <=n; i++) {
			list.add(new Integer(i));
		}
		int last=0;//上一轮的余数
		while(list.size()>2){
			int removeNumber=(list.size()+last)/3;
			int nextlast=(list.size()-(3-last))%3;
			for(int i=removeNumber;i>0;i--){
				list.remove(i*3-1-last);
			}
			last=nextlast;
		}
		if (last==1) {
			return list.get(0);
		} else {
			return list.get(1);
		}
	}

猜你喜欢

转载自blog.csdn.net/zhang___yong/article/details/79323810
今日推荐