sort函数居然能改变元素值?记一次有趣的Bug——四数之和

sort函数(C++)(sort是不稳定排序 可以改成稳定排序 stable_sort 用法和sort一样) sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。sort函数包含在头文件为#include<algorithm>的c++标准库中。 Sort(start,end,cmp) (1)start表示要排序数组的起始地址; (2)end表示数组结束地址的下一位; (3)cmp用于规定排序的方法,可不填,默认升序。 首先,咱们先来看一看sort()函数的从小到大排序(默认): #include<iostream> #include<alg 阅读详情

坐标leetcode:

给定一个包含n个整数的数组 nuns和一个目标值target,判断nuns 中是否存在四个元素a,b,c和d,使得a + b+c+d的值与target.相等?找出所有满足条件且不重复的四元组。

我想都不想直接深度优先搜索暴力求解:

class Solution {
public:
    vector<vector<int>> res;  //答案
    int sum =0;          //temp中的总和
    vector<int> temp;//用于存储一个解

    bool check(vector<int>&a,vector<int> &b)//用于判断两个解是否相同(因为res中已经排序所以直接比较  很方便)
    {
        for(int i = 0;i<4;i++)
        {
            if(a[i]!=b[i])
            return false;
        }
        return true;
    }

    void dfs(vector<int>&nums,int sub,int target)//sub为当前下标
    {
        if(temp.size()==4)
        {
            if(sum == target)
            {
                for(int i =0;i<res.size();++i)      //判断重复 若重复则不加入此解
                {
                    if(check(res[i],temp))
                    return;
                }
                sort(temp.begin(),temp.end());
                res.push_back(temp);
            }
            return;
        }
        if(sub>=nums.size())
        return ;

         
        //存入当前下标的元素
         sum+=nums[sub];
         temp.push_back(nums[sub]);
         dfs(nums,sub+1,target);
        //不存入当前下标的元素
        sum-=nums[sub];
        temp.erase(temp.end()-1);
       dfs(nums,sub+1,target);

    }
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        dfs(nums,0,target);
        return res;
    }
};

我自信地按下了提交按钮,结果连示例都没过得了!!?

而且结果很让人问号:

这···怎么会出现[-2,-1,-1,2]这个解??

 于是我把sort注释掉  把判重也注释掉:

class Solution {
public:
    vector<vector<int>> res;  //答案
    int sum =0;          //temp中的总和
    vector<int> temp;//用于存储一个解

    bool check(vector<int>&a,vector<int> &b)//用于判断两个解是否相同(因为res中已经排序所以直接比较  很方便)
    {
        for(int i = 0;i<4;i++)
        {
            if(a[i]!=b[i])
            return false;
        }
        return true;
    }

    void dfs(vector<int>&nums,int sub,int target)//sub为当前下标
    {
        if(temp.size()==4)
        {
            if(sum == target)
            {
                 //sort(temp.begin(),temp.end());
          //for(int i =0;i<res.size();++i)      //判断重复 若重复则不加入此解
                //{
                //    if(check(res[i],temp))
                //    return;
               // }
                
                res.push_back(temp);
            }
            return;
        }
        if(sub>=nums.size())
        return ;

         
        //存入当前下标的元素
         sum+=nums[sub];
         temp.push_back(nums[sub]);
         dfs(nums,sub+1,target);
        //不存入当前下标的元素
        sum-=nums[sub];
        temp.erase(temp.end()-1);
       dfs(nums,sub+1,target);

    }
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        dfs(nums,0,target);
        return res;
    }
};

好的,结果惊了,就是正确答案:

于是我开vs复原了这题的解,同样是这个奇怪的结果。

 这···难道sort改变了元素值的大小???

然后我单独试验了sort函数,发现函数并没有问题。

那么问题来了。。。。。。Bug出在哪里?为什么会出现sort函数改变了元素值的假象?

于是我开始了不同的尝试探索问题的原因。

一、改变记录sum的方法

我将全局变量sum去掉,改为需要的时候当场对temp求和。

按道理,结果应该不会改变,但是却改变了。[-2,-1,-1,2]这个解变为了[-1,-1,0,2]。

这说明dfs的执行逻辑出现了问题。

二、用大脑运行程序

这果然是个好办法!。。。

我从头到尾思考了很多遍,感觉逻辑没问题啊。

于是我又从头到尾思考了很多遍,

终  于  知  道  bug  到  底  在  哪  里  了  !

这一切都是因为全局变量temp!

我以为temp.erase(temp.end()-1)就能够把刚才加入的元素给弹掉。。

结果并不是!!因为temp已经排序过了!!!最后一个元素不是在这个递归层加进去的那个元素!!!

 vector<int> ttemp = temp;
            sort(ttemp.begin(), ttemp.end());
        for(int i =0;i<res.size();++i)
        {
          if(check(res[i],ttemp))
          return;
        }

            res.push_back(ttemp);

 

哈!哈!哈!这样总算能过吧!这代码已经绝!对!不!会!有!b!u!g!了!哈!哈!哈!

 退役了再见

 

 

 

 

【OpenCV】手眼标定实战:从原理到calibrateHandEye的完整实现 本文详细解析了机器人视觉中的手眼标定原理与实战,重点介绍了如何使用OpenCV的calibrateHandEye函数实现从数据采集到结果验证的完整流程。文章深入剖析了AX=XB核心方程,区分了眼在手上与眼在手外两种配置,并提供了详细的代码示例与避坑指南,帮助开发者精准建立相机与机械臂末端的坐标转换关系,是机器人精准抓取的关键技术。 阅读详情

相关推荐

海康视觉脚本开发全流程解析

本文详细解析了海康机器视觉平台(VM)中脚本模块的开发全流程。从创建第一个脚本模块入手,深入讲解了输入参数、输出参数与内部变量的定义与区别,并提供了C#脚本编写、公用函数调用、代码结构组织以及编译调试的实用指南。旨在帮助开发者掌握海康视觉脚本开发的核心技巧,高效实现复杂的自定义视觉逻辑处理。

beer8的博客 602

JS 数组的排序 sort()方法原理详解

JS JavaScript 数组中的排序 sort()方法原理详解以及示例展示,并列举了用sort解一些算法题

秋天,黄叶坠地,凉风有信。 1万+

基于STM32与MPU6050的实时姿态检测系统设计与实现(源码+硬件解析)

本文详细介绍了基于STM32单片机与MPU6050传感器的实时姿态检测系统设计与实现。通过硬件解析、传感器校准、卡尔曼滤波算法和欧拉角计算,实现高精度姿态检测。提供完整源码和调试技巧,适用于无人机、平衡车等嵌入式开发项目,解决噪声干扰和数据漂移等常见问题。

jupi8的博客 494

C++ stl 的sort使用中的坑

    stl的sort函数是一个很有用且高效的排序方法。如果自行添加比较函数,可以很大程度上的扩展其功能,使之能灵活的适应各种场景。但是sort在使用过程中存在一些注意事项,如果不加注意,很容易发生bug满地跑,你却不知道bug的源头在哪里的情况。    1.sort需要迭代器是随机访问迭代器。如果使用list容器,可以使用list容器自带的sort成员函数,而不要使用使用这个泛型算法的sor...

nod 7967

本地使用大模型:Ollama+open-webui+AnythingLLM(Windows+linux)

随着大模型的发展,大量的开源模型可以被直接使用。大模型的使用可以选择在云端或者在本地,如果本地存储空间尚可,而且模型需求不是很大的话,我们可以选择在本地部署一个大模型来使用。针对特定的任务需求,进一步在本地去微调我们的大模型。我在windows和linux上都尝试了一遍,这里记录一下过程。

wpqgt的博客 2165

C#构建高精度预测模型:从数据预处理到模型部署的实战指南

【代码】C#构建高精度预测模型:从数据预处理到模型部署的实战指南。

墨夶的博客 1263

c++使用sort函数排序时出现写入位置异常

c++使用sort函数排序时出现写入位置异常 在使用c++语言进行编程的时候,使用到了sort函数对结构体进行排序,编译过程中未报错,运行结果提示 在网上查了好久也没有查到解决办法,最后的解决办法是将代码中结构体定义的string类型改成了char型数组 代码如下: #include <iostream> #include<string> #include&...

qq_43687857的博客 478

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1899

DataSet遍历赋值

前几天修改现场的一个bug,觉得很有意思,特此分享 1.具体bug问题:将数字分别添加到DataSet相应的列中,但现场出现数字叠加,没有相应填入。 int num = 0; if (drowsv.Length &gt; 0) {//sushimao 20180302 注释 ...

长江学者 1294

k3s cpu load 和 cpu 使用率很高处理

在这期间还执行过缩减 sqlite3 数据库操作,不知道是哪个操作起了作用,亦或者两个操作有影响,删除 ns 促进了数据库缩减的执行(没删除之前数据库缩减不成功,db文件大小未减小,但不确定是不是执行完 VACUUM 之后需要时间 db 文件才会减小,或者是因为删除了 ns 才导致其减小),再或者是两个操作都起了作用。kubectl get ns 发现有很多卡在删除状态的 ns。k3s 官网关于这个问题的谈论。执行如下脚本删除掉这些 ns。有人详细说过这个问题。

weixin_40548182的博客 683

Swin Transformer注意力计算复杂度为何比全局注意力少那么多?

本文对比分析了Vision Transformer(ViT)和Swin Transformer的计算复杂度。ViT采用全局注意力机制,计算复杂度为4[hwc^2]+2[(hw)^2C],当图像尺寸较大时计算量显著增加。而Swin Transformer采用窗口注意力机制,将图像划分为M×M的窗口(如7×7),计算复杂度降为4[hwc^2]+2[(hw)(M*M)*C]。以224×224图像为例,Swin Transformer的计算量比ViT减少约900倍,大幅节省了计算资源。文章通过矩阵乘法运算详细推导了

人工智能研究所的博客 62

18. 四数之和

文章目录leetcode18:[18. 四数之和](https://leetcode-cn.com/problems/4sum/)题目描述solution idea双指针法Tricksstd::sortiterator 迭代器迭代器的运算迭代器支持的运算begin 和end 运算符参考文献 leetcode18:18. 四数之和 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums ...

qq_41918762的博客 164

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

如何在C++中用sort函数给map里的值排序?

最简单的方法就是直接使用map的迭代器范围初始化vector,但需要确保vector的元素类型可以接受pair<const key,value>。就是把map中的值都复制到vector中去,然后使用sort函数对vector进行排序,可自定义比较函数来比较值。然后就可以得到一个按值排序后的vector,但map本身的结构不会被改变,因为map本身是不可以按值排序的。map的格式一般是这样的,里面有多个pair,pair<?那么如何用sort给map中的值排序呢?具体例子如下:给成绩排序。

2301_82033776的博客 776

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

sort()函数和sorted()函数的区别

#sort() 和 sorted()函数的区别 #sort只能应用在列表list上,sort方法会在原list上直接进行排序,不会创建新的list #sorted可以对所有可迭代的对象进行排序的操作,sorted方法不会对原来的数据做任何改动,排序后的结果是新生成的 #sort()函数有两个参数:key,reverse #reverse指定排序是正序还是倒序,默认正序False, key指定了只含...

python_o的博客 9003

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MATLAB中sort函数用法

默认情况下,sort 函数按复数值的幅值对其进行排序,再使用相位角对幅值相同的值继续排序。I 的大小与 A 的大小相同,它描述了 A 的元素沿已排序的维度在 B 中的排列情况。例如,sort(A,'ComparisonMethod','abs') 按模对 A 的元素进行排序。例如,如果 A 是一个矩阵,则 sort(A,2) 对每行中的元素进行排序。如果 A 是矩阵,则 sort(A) 会将 A 的列视为向量并对每列进行排序。使用 A(:)(A 的列表示形式)对 A 的所有元素进行排序。

jk_101的博客 3247

Php数组函数中的那些什么sort排序函数是不是很乱? 可以这样看。以及php搜索给定的值在数组中最后一次出现的位置的实现思考

php的数组函数很多,功能也很强大,但如果要想实现搜索给定的值在数组中最后一次出现的位置,Php数组中可真是没有这样的函数。例如要在$array数组中查找789值(不区分类型),可以使用什么方法呢?最low的当然可以使用循环,循环之后最后一次赋值即获取到了最后一个KEY。php#给定一个变量#给定待查询的数组#使用循环的方法但我们要熟练使Php、深入使用Php,一定要更多的利用php已有的方法和功能,不然即便编程多年,也会觉得自己懂得很肤浅。

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 1352

【算法】专题一:双指针之呈最多水的容器,有效三角型的个数,和为 s 的两个数字,三数之和,四数之和

3.当 price[left] + price[right] > target 时,同理我们可以舍去price[right] (最⼩的数都满⾜不了你,你也没救了)。根据解法⼀中的优化思想,我们可以固定⼀个最⻓边,然后在⽐这条边⼩的有序数组中找出⼀个⼆元组,使这个⼆元组之和⼤于这个最⻓边。v = (right - left) * min( height[right], height[left])容器的左边界为 height[left] ,右边界为 height[right]。为了⽅便叙述,我们假设。

2501_93351213的博客 366

python sort函数返回值_如何使用python sort函数?

不知道大家在做项目时候,有没有遇到这个函数,记得小编第一次看到这个函数,一直纳闷这个函数的使用方法,而后查询了下,今日,小编再一次遇到这个函数,于是,就做了一番整理,内容请看下文。与sort()函数相对应的必须要提到sorted()函数啦~结合着两个函数跟大家叙述。(1)使用范围不一样只有当对象是列表时,才能调用sort()方法,而sorted()是全局函数,可作用于所有可迭代对象。(2)返回结果...

weixin_39633113的博客 2908

2024.8.31 Python,合并区间,用sort通过列表第一个元素给列表排序,三数之和,跳跃游戏

造成这样的原因是,前面四个都没有找到合适的好兄弟来给他缩进去,导致最后一个救赎他们的进来了以后每一个都救赎了一遍,但是本身他们应该是一体的,也就是说,如果1,10早早来的话,就没这么多事了,所以我就不知道该怎么办了,一看答案,发现答案里有一个先排序的操作:intervals.sort(key=lambda x: x[0]),这个操作的含义是按照第一个元素先给所有的列表排序,现在我才懂了,列表的最后一个控制到底有没有连接,列表的第一个控制先后顺序,所以在这个操作中必须得先排序。初始位置为 nums[0]。

RaidenMessi的博客 1171

sort函数

如果我们需要按照其他的排序准则,那么就需要我们自己定义一个bool类型的函数来传入。比如说假如要按照每个数的个位数进行从大到小排序,可以写一个bool函数://因为要排序的是两位数,就模10了然后把这个函数当成参数传入sort()中​​i<10;i++){}//输出结果:59 99 96 65 44 13 33 72 21 80return 0;

m0_61483444的博客 1001

sort 函数

转载: https://blog.youkuaiyun.com/weixin_42490152/article/details/100188778?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163048400016780269834497%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163048400016780269834497&amp

Myblog 1806

python sort函数用的什么排序_python排序函数sort()与sorted()的区别

python 中sorted与sort有什么区别sort(cmp=None, key=None, reverse=False)sorted(iterable, cmp=None, key=None, reverse=False)sort是容器的函数,用List的成员函数sort进行排序sorted是Python的内建函数相同的参数,用built-in函数sorted进行排序sorted(itera...

weixin_39685836的博客 2576

一个SORT引起的BUG

关于SORT的测试REPORT ytest_sort. PARAMETERS: p_count TYPE i. PARAMETERS:p_stableTYPEcASCHECKBOX. DATA: BEGIN OF lt_tab OCCURS 0, a TYPE i, b TYPE c, ENDOFlt_tab. DO p_count T...

森林木的博客 161

python定义sort函数_如何使用python sort函数?

不知道大家在做项目时候,有没有遇到这个函数,记得小编第一次看到这个函数,一直纳闷这个函数的使用方法,而后查询了下,今日,小编再一次遇到这个函数,于是,就做了一番整理,内容请看下文。与sort()函数相对应的必须要提到sorted()函数啦~结合着两个函数跟大家叙述。(1)使用范围不一样只有当对象是列表时,才能调用sort()方法,而sorted()是全局函数,可作用于所有可迭代对象。(2)返回结果...

weixin_32393875的博客 1362

Golang 中sort排序不改变相同值相对顺序

今天在用golang自带的sort()排序时遇到的不稳定情况 如果使用Sort或者Slice进行排序,若有相同的值,有可能改变它们的相对顺序 // 相关API,前两个都会改变相对顺序,最后一个不会 sort.Sort(data interface) // 需要实现Len(),Swap(),Less()函数 sort.Slice([]struct ,func(i,j int)bool{ return s[i].age < s[j].age }) sort.SliceStable([]struct ,fu

a1007942636的博客 2063

leetcode15、18:三数之和,四数之和

【代码】leetcode15:三数之和。

weixin_44930313的博客 67
上一篇: 《方格取数》为什么要四维度数组
下一篇: 令人头秃的bug总是源于基础不牢------你知道vector.size()是unsigned int吗
咖啡咖_CoffCa
博客等级 码龄6年 116粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡咖_CoffCa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值