* 题目:一个字符串数组中,若两个元素的首字符相等,则将二者交换,已经交换过的元素一律不交换
例:["ax", "bx", "cx", "cy", "by", "ay", "aaa", "azz"])→["ay", "by", "cy", "cx", "bx", "ax", "azz", "aaa"]
难点:
1.要遍历找出元素
2.要找出元素中的首字符
3.要将此字符及其对应的元素位置标记起来
4.找到下一个首字符与此元素首字符相等的元素
5.要判别此元素是否已被改变
6.找到此两个元素,将之交换
在题目中,由于通过元素位置可以找到元素,所以此题目需要3个标记,用于保存当前元素的位置,与之有相同的首字符的元素位置,与之有相同的首字符的元素是否已被交换过。
而map中的containsKey()方法可以实现检索是否有相同的首字符的元素的功能。get(key)方法可以用来得到其所在位置,而map只能put()两个元素,因此要实现判断是否交换过的功能可以用remove()方法,每一次需要交换则不put()进去,并将已交换的从map中移除,从而不需要对map中元素进行判断是否已交换,也不会对数组元素造成影响。
public String[] allSwap(String[] strings) {
Map<String, Integer>map = new HashMap<String, Integer>();
for(int i=0; i<strings.length; i++){
String str=strings[i].substring(0,1);
if(map.containsKey(str)){
String tem;
tem=strings[i];
strings[i] = strings[map.get(str)];
strings[map.get(str)] = tem;
map.remove(str);
continue;
}
map.put(str,i);
}
return strings;
}
因此,当需要对数组进行操作时可以运用map里面的方法进行巧妙地立flag而又不会对数组产生不必要的影响,用起来得心应手。
要问我代码为什么写得这么屌?戳下面的链接你就知道,想成为码王一样的男人吗?我的代码都放在那了,想要吗?还等什么?赶快去拿吧!!