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