算法——每日一题day01
1、基础知补充
HashSet:
*HashSet是set接口的实现类:HashSet类是Set接口的典型实现类不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
*HashSet作为集合,集合中的元素是无序的,并且如果不指定类型,集合中的元素可以是不同数据类型
声明初始化方法:
HashSet<对象类型> set=new HashSet<>();
HashSet<Integer> set= new HashSet<>();
HashSet常用的方法有五个,分别是:
1、set.add()方法:hashset.add(E e):返回boolean型,如果此 set 中尚未包含指定元素,则添加指定元素;如果此 set 已包含该元素,则该调用不更改 set 并返回 false
<span style="font-size:18px;">//向hashset中添加一个字符串
hashset.add("abc");
//向hashset中添加一个整数
hashset.add(1);
//向hashset中添加一个字符
hashset.add('a');
//向hashset中添加一个数组
int[] abc={10,11,12};
hashset.add(abc);
//向hashset中添加一个自定义对象
Cat cat1=new Cat("asd", 2);
hashset.add(cat1);//向hashset中添加一个对象</span>
2、删除元素
hashset.clear():从此 set 中移除所有元素。
hashset.remove(Object o):如果指定元素存在于此 set 中,则将其移除。
hashset.isEmpty():如果此 set 不包含任何元素,则返回 true。
hashset.contains(Object o):如果此 set 包含指定元素,则返回 true。
hashset.size():返回此 set 中的元素的数量(set 的容量)。
3、代码实现:
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
HashSet<String> set=new HashSet();
set.add("北京");
set.add("天津");
System.out.println(set.add("武汉"));
System.out.println(set.add("北京"));//如果重复返回false
//判断HashSet中是否包含某元素
System.out.println(set.contains("天津"));
System.out.println(set.contains("济南"));
//遍历HashSet集合
for(String s:set){
System.out.println(s);
}
//删除集合中指定元素
set.remove("北京");
//判断集合是否为空
System.out.println(set.isEmpty());
//删除所有元素
set.clear();
System.out.println(set.isEmpty());
}
}
4、常用性质:在算法中常用其添加方法,判断某一数组中是否有重复元素,或者输出去掉重复元素之后的值。由于集合中的元素不允许重复,当集合中没有该元素时,执行添加方法,并返回true;若是有,则返回false
2、算法实战
代码实现:
class Solution {
public int findRepeatNumber(int[] nums) {//注意这里函数的返回值是int,一般不成功返回-1
HashSet<Integer> set=new HashSet<>();
int count=-1;//定义要返回的数据,默认值是-1.是错误情况,再根据后面条件改变初始值
for(int i=0;i<nums.length;i++){
if(!set.add(nums[i])){//添加失败时(存在了重复)
count=nums[i];
break;//找到第一个重复的就跳出循环
}
}
return count;
}
}
方法二:使用排序思想-数组中两个相等元素必然相邻
class Solution {
public int findRepeatNumber(int[] nums) {
//方法二:使用排序的方法,这里输入的数字,如果两个元素相等,那么这两个元素必然相邻
//用nums[i]==nums[i+1进行判断即可]
int count=-1;
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(nums[i]==nums[i+1]){//利用两个相等的元素必然相邻的特性
count=nums[i];
break;
}
}
return count;
}
}
拓展:
Arrays类:
此类包含用来操作数组(比如排序和搜索)的各种方法!直接调用即可;
常用方法包括:
1、toString方法
int[] arrInt = {55,44,33,22,11};
//使用toString方法遍历数组,省可以替代自己编写的for循环
String str = Arrays.toString(arrInt);
System.out.println(str);
//结果为:[55, 44, 33, 22, 11]//将数组中的内容打印为字符串
2、Arrays.sort(数组名)排序方法,如本例中的方法
3、Arrays.binarySearch(数组名, 要查找的值);
注:二分查找之前必须先进行排序
int[] arrInt = {55,44,33,22,11};
//使用binarySearch方法前对数组进行排序
Arrays.sort(arrInt);
int num = Arrays.binarySearch(arrInt, 44);
System.out.println("数字44在数组中的索引位置为:"+num);//结果为:数字44在数组中的索引位置为:3
方法三:暴力求解---会超出时间限制,因为是双重循环了
class Solution {
public int findRepeatNumber(int[] nums) {
int count=-1;
for(int i=0;i<nums.length;i++){
for(int j=0;j<nums.length;j++){
if(nums[i]==nums[j]&&i!=j){
count=nums[i];
break;
}
}
if(count!=-1){
break;
}
}
return count;
}
}