【问题标题】:Sort an array by increasing frequency通过增加频率对数组进行排序
【发布时间】:2021-10-22 06:49:14
【问题描述】:

谁能解释一下如何处理运行时错误?

第 1034 行:字符 34:运行时错误:将无符号偏移量添加到 0x607000000020 溢出到 0x607000000018 (stl_vector.h) 摘要:UndefinedBehaviorSanitizer:未定义行为 /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h :1043:34

Code fiddle

class Solution {
public:
    static bool cmp(pair<int,int> a, pair<int,int> b){
        if(a.first<b.first) return true;
        if(a.first==b.first && a.second>b.second) return true;
        return false;
    }
    vector<int> frequencySort(vector<int>& nums) {
        int n = nums.size();
        vector<int> res;
       vector<pair<int,int>> v(n);
        for(int i = 0;i<n;i++){
            v[nums[i]].first++;
            v[nums[i]].second = nums[i];
        }
        sort(v.begin(),v.end(),cmp);
        for(int i =0;i<n;i++){
            for(int j =0;j<v[i].first;j++){
                
                    res.push_back(v[i].second);
                
            }
        }
        return res;
    }
};

【问题讨论】:

  • 考虑这一点:v[nums[i]],您确定num[i] 大于或等于0 且小于v.size()?尝试改用std::map
  • 您应该在帖子中提供要解决的问题的完整描述,而不是仅作为链接。
  • 在这种情况下指出第 1034 行是有用的,以便准确识别问题所在 - 并解释这段代码应该做什么。

标签: c++ arrays


【解决方案1】:

有两个问题:

  1. nums[i] 介于 -100100 之间。向量v 无法处理这种情况。这可以通过 100 的偏移量轻松修复。

  2. vector&lt;pair&lt;int,int&gt;&gt; v(n);。请记住,这是一个频率向量。它不能处理例如n = 5num[i] 达到50100 的情况。这也可以通过不同的 const resize 来解决。

新代码:

static bool cmp(pair<int,int> a, pair<int,int> b){
        if(a.first<b.first) return true;
        if(a.first==b.first && a.second>b.second) return true;
        return false;
    }

const int offset = 100;
const int sz = 201; //because with an offset of 100, nums[i] could reach max 100+100=200
vector<int> frequencySort(vector<int>& nums)
{
    int n = nums.size();
    vector<int> res;
    vector<pair<int,int>> v(sz);
    for(int i = 0;i<n;i++){
        v[nums[i]+offset].first++;
        v[nums[i]+offset].second = nums[i]+offset;
    }
    sort(v.begin(),v.end(),cmp);
    for(int i =0;i<sz;i++){
        for(int j =0;j<v[i].first;j++){
                res.push_back(v[i].second-offset);

        }
    }
    return res;
}

P.S:做编程题的时候要检查约束:

1 <= nums.length <= 100
-100 <= nums[i] <= 100

和测试用例。在这个问题上,案例:

Input: nums = [-1,1,-6,4,5,-6,1,4,1]
Output: [5,-1,4,4,-6,-6,1,1,1]

Leetcode 提供的可以帮助你更快地调试。

【讨论】: