【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

目录
相关文章
|
4月前
|
存储 编译器 C++
【C++】vector介绍+模拟实现
【C++】vector介绍+模拟实现
|
27天前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
52 4
|
9天前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
31 0
|
13天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
26 0
|
2月前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
26 1
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
77 6
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
92 7
|
2月前
|
编译器 C++
【C++】—— vector模拟实现
【C++】—— vector模拟实现
|
2月前
|
编译器 C语言 C++
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
62 3
|
2月前
|
C++
【C++】C++ STL探索:Vector使用与背后底层逻辑(三)
【C++】C++ STL探索:Vector使用与背后底层逻辑