2020-12-23

算法——每日一题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;
    }
}

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值