leetcode题目描述:
Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.
解题思路:
方法一、
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
if(nums.size()==1) return true;
if(nums.size()==0) return false;
bool flag=false;
for(vector<int>::iterator iter=nums.begin();iter!=nums.end();iter++)
{
for(vector<int>::iterator iter1=iter+1;iter1!=nums.end();iter1++)
{
if(*iter==*iter1)
{
flag=true;
return flag;
}
}
}
return flag;
}
};
方法二、
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
if(nums.size()==1) return false;
if(nums.size()==0) return false;
bool flag=true;
int s=nums.size();
sort(nums.begin(),nums.end());
nums.erase(unique(nums.begin(),nums.end()),nums.end());
int e=nums.size();
if(s==e)
flag=false;
return flag;
}
};
下面我们主要介绍unique函数、以及unique_copy函数:
unique()函数是将重复的元素折叠缩编,使成唯一。
unqiue_copy()函数是将重复的元素折叠缩编,使成唯一,并复制到他处。
这两个函数的剔除字符原理是,看当前字符与他前一个字符是否相同,如果相同就剔除当前字符,如果不同就跳转到下一个字符。所以在求一个字符串的字符集的时候要先把字符串排个序再调用上面两个函数剔除重复字符,获取字符集。
下面看一些代码比较
- string str = "zhaohaoyang";
- vector<char> vecch(str.begin(), str.end()); //根据迭代器的起始位置和终止位置来定初始化一个容器
- vector<char>::iterator it = vecch.begin();
- for (; it != vecch.end(); ++it)
- {
- cout<<*it;
- }
- cout<<endl; 输出:zhaohaoyang
再加上下面两行:
- unique(str.begin(), str.end());
- out<<str<<endl; //输出的还是原样:zhaohaoyang
假如把str换成"acttacct"执行上面的两句代码结果是:actactct,这个结果也是奇怪的。按照意愿应该是把多于的t与多于的c剔掉后只剩下actact了啊。最后两个字符ct是怎么回事呢?
因为unique()函数并不是真的在源字符串上进行剔除的,原来的字符串经过unique()函数后虽然除掉了相邻之间重复的字符,可是字符串长度是不变的,也就是说所占内存大小没变。
遇到这个问题通常会这么做str.erase(unique(str.begin(), str.end()), str.end());
unique()函数的返回值是源字符串中去除相邻之间相同字符后剩下的字符串中的最后一个字符的下一个位置,
举例说明:"acttacct"有8个字符,相邻之间重复的有两个,"acttacct"被unique()后的字符串面貌是"actactXX",
X代表的是不确定的字符。unique函数的返回值是一个迭代器类型,指向的是第一个X所处的位置。
STL中的参数区间都是左闭右开的,str.end()返回的迭代器指向第二个X位置的后面一个位置,所以调用str.erase()后就把后两个不确定的字符XX删除掉了。最后得到的就是我们最开始想要的结果了"actact"。
以上展示还未用的sort()排序函数。现在来看sort()的加入会有什么新的变化。前面说到unique()和unique_copy()函数都是针对相邻之间相同字符的剔除,他们并不会从一个字符串的整体去剔除重复字符,如果不用sort()函数,那么我们想要获取一个字符串所包含的的字符集并不是每一次都能保证正确的(如果字符串中没有相同的字符就是正确的,如果相同的字符都是在相邻位置出现结果也是正确的,但大多数情况下却不是这么回事)。
- string str = "zhaohaoyang";
- vector<char> vecch(str.begin(), str.end());
- sort(str.begin(), str.end());
- str.erase(unique(str.begin(), str.end()), str.end());
- cout<<str<<endl; //输出:aghnoyz
上面所展示的是把获取的字符集存储在了源字符串变量中,如果遇到要把字符集放置在额外的变量中的情况,就要用到unique_copy()函数了。来看一段代码:
- string str = "zhaohaoyang";
- string dststr;
- dststr.resize(str.size());
- sort(str.begin(), str.end());
- dststr.resize(unique_copy(str.begin(), str.end(), dststr.begin()) - dststr.begin());
- cout<<dststr<<endl; //输出:aghnoyz