89. 格雷编码/1046. 最后一块石头的重量
作者:互联网
这题咱上来就是一个模拟,我知道题解肯定用位运算,但无奈不会啊,难受。记录一下我的笨比模拟思路(java用时41ms,真的慢),然后老老实实学位运算。
思路:
1.首先格雷码有一个很有意思的规律就是n+1位的格雷码的前n个是正序n位格雷码加前缀0,后n个是逆序n位格雷码加前缀1。这个规律之前学信息论的时候手写格雷码用起来还是挺爽的。
2.根据这个规律,那么我可以使用动态规划的思想,首先记录1位格雷码,根据1位格雷码得到2位格雷码,再根据得到的2位格雷码得到3位格雷码,…依次遍历,直到得到n位格雷码。
3.最后将得到的n位格雷码(二进制字符串形式)转为十进制数字,存入ans列表并返回。
代码:
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,这是思维僵化了嘛~
思路:
1.将stone添加到list里边,先将list排序。
2.循环遍历list列表,如果x为倒数第二个元素,即次大值,y为倒数第一个元素,即最大值。当x = y时,将x和y全都从列表中移除,否则,将y从列表中移除,将x对应位置上的值改为y-x。并重新对list进行排序。
3.当list长度小于2时退出循环,此时如果list长度为0这说明石头被全部粉碎,返回0;如果list长度为1,这说明还剩一块石头没有粉碎,返回这块石头的重量。
代码:
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;
}
}
标签:格雷,1046,int,list,len,add,89,new 来源: https://blog.csdn.net/weixin_42593011/article/details/122380612