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); } }