LeetCode 心得:
数组问题
数组中有一类问题是设计到了数组的内可能存在的重复数据的问题,通常有几种常见的处理方式:
1.使用集合(set)数据结构,可以直接将重复的元素删除掉,具体方法:
Set<Integer> set = new HashSet<>(); //创建set集合
set.add();//这个函数如果遇到重复的元素会返回false
2.若是目标就是这些重复的元素则有:
1.可以先考虑对数组进行排序操作,这样可以将重复的元素都放在一起便于操作。
2.可以使用hashMap来对数组进行操作:
HashMap<int,int> map=new HashMap<>;
//先把数组nums1的所有元素都存放到map中,其中key是数组中的元素,value是这个元素出现在数组中的次数
for(int i = 0;i < nums.length();i++)
{
map.put(nums[i],map.getOrDefault(nums[i],0) + 1);
}
迭代器
迭代器的一些小操作:
1.简单的介绍:
要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。
迭代器按照定义方式分成以下四种。
- 正向迭代器,定义方法如下:
容器类名::iterator 迭代器名;
- 常量正向迭代器,定义方法如下:
容器类名::const_iterator 迭代器名;
- 反向迭代器,定义方法如下:
容器类名::reverse_iterator 迭代器名;
- 常量反向迭代器,定义方法如下:
容器类名::const_reverse_iterator 迭代器名;
迭代器用法示例
通过迭代器可以读取它指向的元素,*迭代器名就表示迭代器指向的元素。通过非常量迭代器还能修改其指向的元素。
迭代器都可以进行++操作。反向迭代器和正向迭代器的区别在于:
- 对正向迭代器进行
++操作时,迭代器会指向容器中的后一个元素; - 而对反向迭代器进行
++操作时,迭代器会指向容器中的前一个元素。
begin 成员函数返回指向容器中第一个元素的迭代器。++i 使得 i 指向容器中的下一个元素。end 成员函数返回的不是指向最后一个元素的迭代器,而是指向最后一个元素后面的位置的迭代器,因此循环的终止条件是i != v.end()。
后置++要多生成一个局部对象 tmp,因此执行速度比前置的慢。同理,迭代器是一个对象,STL 在重载迭代器的++运算符时,后置形式也比前置形式慢。在次数很多的循环中,++i和i++可能就会造成运行时间上可观的差别了。因此,本教程在前面特别提到,对循环控制变量i,要养成写++i、不写i++的习惯。
同时,介绍三种迭代器的功能: