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

我想都不想直接深度优先搜索暴力求解:
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!了!哈!哈!哈!

退役了再见
sort函数居然能改变元素值?记一次有趣的Bug——四数之和的更多相关文章
- STL sort 函数实现详解
作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...
- STL sort 函数实现详解 ZZ
前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不对劲,知道自己回答错了.这几天特意看了一下,在 ...
- jquery获取、改变元素属性值
//标签的属性称作元素属性,在JS里对应的DOM对象的对应属性叫DOM属性.JS里的DOM属性名有时和原元素属性名不同. //==================================操作元 ...
- java 数据类型:集合接口Collection之List~ArrayList:remove移除;replaceAll改变原有值;sort排序;迭代器listIterator();
什么是List集合: 特点: 元素有序可重复的集合. 集合中每个元素都有其对应的顺序索引. List集合默认按元素的添加顺序设置元素的索引,索引从0开始. List接口的常用方法: List可以使 ...
- /编写一个函数,要求从给定的向量A中删除元素值在x到y之间的所有元素(向量要求各个元素之间不能有间断), 函数原型为int del(int A ,int n , int x , int y),其中n为输入向量的维数,返回值为删除元素后的维数
/** * @author:(LiberHome) * @date:Created in 2019/2/28 19:39 * @description: * @version:$ */ /* 编写一个 ...
- sort函数用法
原文链接:http://blog.csdn.net/csust_acm/article/details/7326418 sort函数的用法 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己 ...
- Perl Sort函数用法总结和使用实例
一) sort函数用法 sort LISTsort BLOCK LISTsort SUBNAME LIST sort的用法有如上3种形式.它对LIST进行排序,并返回排序后的列表.假如忽略了SUBNA ...
- STL——sort函数简介
参考:http://blog.csdn.net/s030501408/article/details/5329477 0)与C标准库qsort的比较:http://bbs.csdn.net/topic ...
- SORT函数的使用方法(转载)
sort函数的用法(转载出处:http://blog.sina.com.cn/s/blog_6439f26f01012xw3.html) 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写 ...
随机推荐
- PAT-B1009 说反话 - 字符串反转
1009 说反话 (20分) 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串.字符串由若干单词和若干空格组 ...
- JS - 有趣的面试题
for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); } //这个例子执行完输出什么结果 ...
- Labview学习之路(十三)数组函数
本文章介绍一下函数选版中的数组函数,一眼看懂没什么特殊地方的就不说了 (一)数组大小 返回I32类型的数或者数组. 什么是I32类型?就是32位有符号整型, 有符号什么意思?就是在32位数据中最高做符 ...
- 喵的Unity游戏开发之路 - 互动环境(有影响的运动)
如图片.视频或代码格式等显示异常,请查看原文: https://mp.weixin.qq.com/s/Sv0FOxZCAHHUQPjT8rUeNw 很多童鞋没有系统的Unity3D游戏开发基础,也不知 ...
- 你不得不知的Java基础知识
本篇博客主要记录Java中面向对象的概念和Java语法的基础知识. 面向对象 什么是面向对象 面向对象是一种优秀的软件设计思想,是相对于面向过程.面向切面等设计思想的一种软件设计理念.它的核心思想是运 ...
- 谈谈Python中列表、元组和数组的区别和骚操作
一.列表(List) 1.列表的特点 列表是以方括号“[]”包围的数据集合,不同成员以“,”分隔.如 L = [1,2,3], 列表a有3个成员. 列表是可变的数据类型[可进行增删改查],列表中可以包 ...
- C#发送邮件三种方法,Localhost,SMTP,SSL-SMTP
C#发送邮件三种方法,Localhost,SMTP,SSL-SMTP 通过.Net FrameWork 2.0下提供的“System.Net.Mail”可以轻松的实现,本文列举了3种途径来发送: 1. ...
- AI研讨会直播:《人工智能开发前沿》实战系列公开课第1期
报名链接:https://www.slidestalk.com/m/276 活动背景 业务需求.数据.算法.算力等因素,决定人工智能技术走向产业落地面临各种挑战.博客园联合示说网以及产业内人工智能技术 ...
- Mybatis-使用注解开发
使用注解开发 [toc] 1. 面向接口编程 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 ...
- Java的枚举简单应用
/** * 请用枚举方式实现如下应用: * 客户去旅店住房, * 客户分普通客户,和vip客户,vip分白金和钻石客户 * 不同的客户有不同的折扣 * 入住的房间分单人房,双人房和套房 * 不同的房间 ...