糖逗 发表于 2020-5-16 17:21:25

C++刷leetcode(1356. 根据数字二进制下 1 的数目排序)【位运算】

题目描述:
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。

如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。

请你返回排序后的数组。

 

示例 1:

输入:arr =
输出:
解释: 是唯一一个有 0 个 1 的数。
都有 1 个 1 。
有 2 个 1 。
有 3 个 1 。
按照 1 的个数排序得到的结果数组为
示例 2:

输入:arr =
输出:
解释:数组中所有整数二进制下都只有 1 个 1 ,所以你需要按照数值大小将它们排序。
示例 3:

输入:arr =
输出:
示例 4:

输入:arr =
输出:
示例 5:

输入:arr =
输出:
 

提示:

1 <= arr.length <= 500
0 <= arr <= 10^4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


int com(int input){
    int res = 0;
    while(input){
      res += input&1;
      input >>= 1;
    }
    return res;
}
bool cmp(int a, int b){
    int num1 = com(a), num2 = com(b);
    return num1 == num2 ? a < b : num1 < num2;
}
class Solution {
public:
    vector<int> sortByBits(vector<int>& arr) {
      sort(arr.begin(), arr.end(), cmp);
      return arr;
    }
};


注意事项:
1.sort中的cmp函数还是单独写比较好。

糖逗 发表于 2020-5-16 17:24:19

使用[&](int&a, int&b){return ;}溢出了,还没找到原因{:10_280:}

永恒的蓝色梦想 发表于 2020-5-16 17:45:21

糖逗 发表于 2020-5-16 17:24
使用[&](int&a, int&b){return ;}溢出了,还没找到原因

没引用,没出错const static bool _=[](){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    return false;
}();


int BitCount(int n){
    int result=0;
    while(n){
      result+=n&1;
      n>>=1;
    }
    return result;
}


class Solution {
public:
    vector<int> sortByBits(vector<int>& arr) {
      sort(arr.begin(),arr.end(),[](int a,int b){
            int c=BitCount(a),d=BitCount(b);
            return c==d?a<b:c<d;
      });
      return arr;
    }
};

糖逗 发表于 2020-5-16 18:47:14

永恒的蓝色梦想 发表于 2020-5-16 17:45
没引用,没出错

这个写法我看懂了,但是我这个写法不知道为啥溢出了{:10_245:}
class Solution {
public:
    int comput(int input){
      int res = 0;
      while(input){
            res += input&1;
            input >>= 1;
      }
      return res;
    }
    vector<int> sortByBits(vector<int>& arr) {
      vector<int> res(arr);
      vector<int> store;
      for(int i = 0; i < arr.size(); i++){
            store.push_back(comput(arr));
      }
      // for(auto cha : res)cout << cha << " ";
      // cout << endl;
      // for(auto cha : store) cout << cha << " ";
      sort(res.begin(), res.end(), [&](int& a, int& b){return store == store? arr < arr : store < store;});
      return res;
    }
};

永恒的蓝色梦想 发表于 2020-5-16 19:00:39

本帖最后由 永恒的蓝色梦想 于 2020-5-16 19:03 编辑

糖逗 发表于 2020-5-16 18:47
这个写法我看懂了,但是我这个写法不知道为啥溢出了

我没记错的话,sort 给比较函数传进来的不是 index,而是值,所以我就不能理解你的 store store arr arr 了。

糖逗 发表于 2020-5-16 20:11:33

永恒的蓝色梦想 发表于 2020-5-16 19:00
我没记错的话,sort 给比较函数传进来的不是 index,而是值,所以我就不能理解你的了。

https://fishc.com.cn/thread-166741-1-1.html


我之前做另一个题的时候,看到了这种写法,当时觉得挺方便的{:10_297:}

糖逗 发表于 2020-5-16 20:13:54

永恒的蓝色梦想 发表于 2020-5-16 19:00
我没记错的话,sort 给比较函数传进来的不是 index,而是值,所以我就不能理解你的了。

还有这道题1337. 方阵中战斗力最弱的 K 行

我按照上一个帖子中的[&]这种写法还可以通过,真的迷惑{:10_284:}
class Solution {
public:
    vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
      vector<int> res;
      vector<int> store;
      for(int i = 0; i < mat.size(); i++){
            int temp = 0;
            store.push_back(i);
            for(int j = 0; j < mat.size(); j++){
                if(mat == 1) temp ++;
            }
            res.push_back(temp);
      }
      //for(auto cha : res) cout << cha << " ";
      sort(store.begin(), store.end(), [&](int&a, int&b){return res != res ?res < res: a<b;});
      vector<int> result (store.begin(), store.begin() + k);
      return result;
    }
};

永恒的蓝色梦想 发表于 2020-5-16 20:15:55

糖逗 发表于 2020-5-16 20:13
还有这道题1337. 方阵中战斗力最弱的 K 行

我按照上一个帖子中的[&]这种写法还可以通过,真的迷惑{:10 ...

玄学C++{:10_284:}

糖逗 发表于 2020-5-16 20:22:52

永恒的蓝色梦想 发表于 2020-5-16 20:15
玄学C++

I don‘t konw{:10_266:} 先不想了,也许过段时间能懂{:10_284:}
页: [1]
查看完整版本: C++刷leetcode(1356. 根据数字二进制下 1 的数目排序)【位运算】