【C++】vector OJ练习(二)

简介: 【C++】vector OJ练习(二)

4. 只出现一次的数字 II

题目链接: link

dc3bf9e37270437bb983654fc159304c.png思路讲解

这道题还是让我们找出数组中只出现一次的那个数字,但是与第一题不同的是,其余数字均出现三次。

那我们用第一题的方法肯定是不行了,那我们可以怎么做呢?

我们后面学了unordered_map的话用unordered_map其实可以很容易解这道题,不过我们现在还没学。


那这里我就用了一种比较暴力的方法,也很好理解:


怎么做呢?

遍历数组,一次取每个元素与其余元素进行比较,如果出现相等的情况,那就说明当前元素不是我们要找的数字,那就看下一个,如果某个元素与其余数字都不想等,就是要找的目标数字。

当然效率可能没有那么高。

AC代码

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret=0;
        for(int i=0;i<nums.size();++i)
        {
            int flag=1;
            for(int j=0;j<nums.size();++j)
            {
                if(i==j)
                    continue;
                if(nums[i]==nums[j])
                {
                    flag=0;
                    break;
                }
            }
            if(flag)
            {
                ret=nums[i];
                break;
            }
        }
        return ret;
    }
};

4b9fafe7d2b941969f4a7bc07d2a0e57.png

5. 删除有序数组中的重复项

题目链接: link

034b77b4d8444eaf94778d95bcb8c835.png

思路讲解

这道题我们可以考虑使用“双指针”来求解:

首先,定义两个变量作为指针,初始都指向下标为0位置。

dd7caf6ba6744d4a8935eddb6d21832d.png

如果两指针指向的元素相等,我们只让 src++往后走,过滤掉重复值。

2d67a9299e70427d85a4096220a9f3fa.png

如果不再相等,先让dest++,让后把src指向的元素赋值给dest指向的元素,然后再让src++。

5d5506def47245cc841e84cf3a91ab18.png

然后再判断两指针指向的元素是否相等,重复上述操作,直至src遍历完数组。

c7bd24117cf1460aa912411af004149d.png

最终dest+1就是去重后的数组长度。

AC代码

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int dest=0;
        int src=0;
        while(src<nums.size())
        {
            if(nums[src]==nums[dest])
                ++src;
            else
            {
                // ++dest;
                // nums[dest]=nums[src];
                // ++src;
                nums[++dest]=nums[src++];
            }
        }
        return dest+1;
    }
};

cafb9522ba2e47df8ce9a1645a05cd77.png

6. 数组中出现次数超过一半的数字

题目链接: link

b302ae5745ab4b438da200ae1c35fdcf.png

思路讲解

这道题其实有一个很简单的解法:

怎么做呢?

只要给这个数组排下序就行了,然后直接返回排好序之后数组中间的那个元素即可。
因为我们要找的数字在数组中出现的次数超过数组长度的一半,所以排好序之后中间位置的元素肯定是这个出现的次数超过数组长度的一半的元素。

AC代码

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        sort(numbers.begin(),numbers.end());
        return  numbers[numbers.size()/2];
    }
};

1f5168634527455583d08ad6481399b5.png

这篇文章的内容就到这里,欢迎大家指正!!!

3a873d92a0ba4e96b2dd72245939834e.png

目录
相关文章
|
5天前
|
C++ 容器
C++之评委打分案例(vector与deque容器练习)
C++之评委打分案例(vector与deque容器练习)
8 1
|
10天前
|
存储 算法 C++
C++一分钟之-容器概览:vector, list, deque
【6月更文挑战第21天】STL中的`vector`是动态数组,适合随机访问,但插入删除非末尾元素较慢;`list`是双向链表,插入删除快但随机访问效率低;`deque`结合两者优点,支持快速双端操作。选择容器要考虑操作频率、内存占用和性能需求。注意预分配容量以减少`vector`的内存重分配,使用迭代器而非索引操作`list`,并利用`deque`的两端优势。理解容器内部机制和应用场景是优化C++程序的关键。
20 5
|
6天前
|
存储 算法 C++
【C++/STL】:vector容器的基本使用
【C++/STL】:vector容器的基本使用
14 1
|
7天前
|
存储 安全 算法
C++的内置数组和STL array、STL vector
C++的内置数组和STL array、STL vector
|
16天前
|
存储 算法 程序员
【C++进阶】深入STL之vector:构建高效C++程序的基石
【C++进阶】深入STL之vector:构建高效C++程序的基石
17 1
|
25天前
|
存储 C++
C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现
C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现
23 8
|
25天前
|
存储 编译器 Linux
C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题
C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题
28 7
|
25天前
|
存储 C++ 容器
C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用
C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用
25 7
|
4天前
|
C++ 容器
【c++】优先级队列|反向迭代器(vector|list)
【c++】优先级队列|反向迭代器(vector|list)
5 0
|
5天前
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
12 0