其他分享
首页 > 其他分享> > 89. 格雷编码/1046. 最后一块石头的重量

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