leetcode-Contains Duplicate,STL unique,unique_copy等函数的使用

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.

解题思路:

本题要求判断一个数组中是否有重复元素,如果有,返回true,如果没有返回false。

方法一、

从头到尾,一次遍历一旦出现相同的元素,返回true即可。

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;

    }
};

方法二、

利用STL容器函数unique,去除重复元素,最后判断去除重复元素之后的数组大小是否与最初的数组大小相等,若不同,说明有重复元素存在,返回true,否则返回false。

代码如下:

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()函数是将重复的元素折叠缩编,使成唯一,并复制到他处。

这两个函数的剔除字符原理是,看当前字符与他前一个字符是否相同,如果相同就剔除当前字符,如果不同就跳转到下一个字符。所以在求一个字符串的字符集的时候要先把字符串排个序再调用上面两个函数剔除重复字符,获取字符集。

下面看一些代码比较

[cpp] view
plain
copy

  1. string str = "zhaohaoyang";
  2. vector<char> vecch(str.begin(), str.end()); //根据迭代器的起始位置和终止位置来定初始化一个容器
  3. vector<char>::iterator it = vecch.begin();
  4. for (; it != vecch.end(); ++it)
  5. {
  6. cout<<*it;
  7. }
  8. cout<<endl;  输出:zhaohaoyang

再加上下面两行:

[cpp] view
plain
copy

  1. unique(str.begin(), str.end());
  2. out<<str<<endl;  //输出的还是原样:zhaohaoyang

unique()是剔除重复的没错,可是他是剔除相邻之间字符重复的,str中的字符前后之间是没有重复的,所以unique函数是起不到作用的。

假如把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()函数,那么我们想要获取一个字符串所包含的的字符集并不是每一次都能保证正确的(如果字符串中没有相同的字符就是正确的,如果相同的字符都是在相邻位置出现结果也是正确的,但大多数情况下却不是这么回事)。

[cpp] view
plain
copy

  1. string str = "zhaohaoyang";
  2. vector<char> vecch(str.begin(), str.end());
  3. sort(str.begin(), str.end());
  4. str.erase(unique(str.begin(), str.end()), str.end());
  5. cout<<str<<endl;      //输出:aghnoyz

在第二段代码中两行展示的不能剔除重复字符,现在可以从一个字符串出发剔除重复字符了,可以获取一个字符串的字符集了。关键在于使用了sort()函数对字符串进行排序,排序后的字符串相同字符都会集中出现,所以unique()就能正确发挥功能了。

上面所展示的是把获取的字符集存储在了源字符串变量中,如果遇到要把字符集放置在额外的变量中的情况,就要用到unique_copy()函数了。来看一段代码:

[cpp] view
plain
copy

  1. string str = "zhaohaoyang";
  2. string dststr;
  3. dststr.resize(str.size());
  4. sort(str.begin(), str.end());
  5. dststr.resize(unique_copy(str.begin(), str.end(), dststr.begin()) - dststr.begin());
  6. cout<<dststr<<endl;   //输出:aghnoyz

dststr是存储字符集的目标串,str是源字符串变量。dststr在用之前必须要先设置大小,否则到unique_copy()的时候会报内存错误,因为是要存储字符串的字符集,所以dststr设置和源字符串相同的大小是完全可以的,最后再把剩余的位置erase掉就好了。

值得注意的是:

STL中list和vector的排序函数表示不同,如下:

list<int> a.

list.sort();

vector<int> b;

sort(b.begin(),b.end());

时间: 2024-10-12 18:41:43

leetcode-Contains Duplicate,STL unique,unique_copy等函数的使用的相关文章

c++ STL unique , unique_copy函数

一.unique函数 类属性算法unique的作用是从输入序列中"删除"全部相邻的反复元素. 该算法删除相邻的反复元素.然后又一次排列输入范围内的元素,而且返回一个迭代器(容器的长度没变,仅仅是元素顺序改变了),表示无反复的值范围得结束. // sort words alphabetically so we can find the duplicates sort(words.begin(), words.end()); /* eliminate duplicate words: *

STL unique

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} STL unique unique 删除相邻之间重复的元素 int main(void) { vector<int> v; v.push_back(3); v.push_back(3); v.push_back(3); v.push_back(1); v.push_back(5);

【C++】【STL】二分查找函数

binary_search 这个函数的返回值是布尔型,也就是最简单的找到了就为真,没找到就是假. 传入参数有三个,数据集合的左端点,数据集合的右端点,查找的值. 注意这些左端点右端点是要求左开右闭原则的,就是和数学上的左开右闭区间[a, b)一样,右端点是个不会被查阅的值. 一般来说写法类似: bool flag = false; int data[n] = {...};///数据 sort(data, data + n); flag = binary_search(data, data + n

[LeetCode] Remove Duplicate Letters 移除重复字母

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results. Example: Given "bcabc&q

[LeetCode] Delete Duplicate Emails 删除重复邮箱

Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique emails based on its smallest Id. +----+------------------+ | Id | Email | +----+------------------+ | 1 | [email protected] | | 2 | [email protected]

【Leetcode】Duplicate Emails

题目链接:https://leetcode.com/problems/duplicate-emails/ 题目: Write a SQL query to find all duplicate emails in a table named Person. +--+---+ | Id | Email | +--+---+ | 1 | [email protected] | | 2 | [email protected] | | 3 | [email protected] | +--+---+ F

unique()函数

unique()是c++里面的一个去重函数,包含在<iostream>中. 该函数将重复的元素移至容器的末尾,返回的为前面的无重复项的尾地址. 由于返回的是地址,所以经常需要转换为数值使用. 比如: 1 int num[10]={1,1,2,2,2,3,4,5,5,5}; 2 int ans=unique(num,num+10)-num; 返回的ans值为5,,前5项为1 2 3 4 5.

stl::map之const函数访问

如何在const成员数中访问stl::map呢?例如如下代码: string ConfigFileManager::MapQueryItem(const string& name) const { if (_map_name_value.find(name) != _map_name_value.end()) { return _map_name_value[name]; } return ""; } 上面的代码会报错:error C2678: 二进制“[”: 没有找到接受“c

LeetCode - Delete Duplicate Emails

Discription:Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique emails based on its smallest Id. 删除重复的Email地址,保留Id最小的那个. 使用自身连接循环即可. # Write your MySQL query statement below delete p1 from Person p1, P