这题咱上来就是一个模拟,我知道题解肯定用位运算,但无奈不会啊,难受。记录一下我的笨比模拟思路(java用时41ms,真的慢),然后老老实实学位运算。
思路:
代码:
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> ans = new ArrayList<>();
List<StringBuilder> list = new ArrayList<>();
list.add(new StringBuilder().append(0));
list.add(new StringBuilder().append(1));
for (int i = 2; i <= n ; i++) {
int len = list.size();
//before + 0
for (int j = 0; j < len; j++) {
StringBuilder b = new StringBuilder();
b.append(0);
b.append(list.get(j));
list.add(b);
}
//after + 1
for (int j = len-1; j >=0; j--) {
StringBuilder b = new StringBuilder();
b.append(1);
b.append(list.get(j));
list.add(b);
}
list = list.subList(len,list.size());
}
for (StringBuilder stringBuilder : list) {
ans.add(Integer.parseInt(stringBuilder.toString(),2));
}
return ans;
}
}
下面是官方题解的代码,我依然看不懂这是怎么操作的,感觉写的公式跟实际操作没什么关系啊。不过代码也不长,背它!
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> ret = new ArrayList<Integer>();
for (int i = 0; i < 1 << n; i++) {
ret.add((i >> 1) ^ i);
}
return ret;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/gray-code/solution/ge-lei-bian-ma-by-leetcode-solution-cqi7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
还是模拟,我突然发现我做题的第一反应就是先模拟,只要能靠模拟写出来,那我大脑中优先跳出来的方法就是模拟,emm,这是思维僵化了嘛~
思路:
代码:
class Solution {
public int lastStoneWeight(int[] stones) {
List<Integer> list = new ArrayList<>();
for (int i : stones){
list.add(i);
}
Collections.sort(list);
int len = list.size();
while(len>=2){
int x = list.get(len-2),y = list.get(len-1);
list.remove(len-1);
if (x == y){
list.remove(len-2);
}else {
list.set(len-2,y-x);
}
Collections.sort(list);
len = list.size();
}
return len == 1 ? list.get(0) : 0;
}
}