算法题必备Tips(Java)

307 阅读1分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

在我们刷题中,每个编程语言都有自己便捷的一处,例如javascript使用Set对数组去重,就一句话搞定,比Java爽之又爽。那么,本文整理了Java在实际刷题中常使用的一些方法。

1. 检验字符能否转化为数字

String s1 = "abc";
String s2 = "3";
if(s1.charAt(0) < 'a' ){ // 利用ASCII编码大小与‘a’的比较结果
    System.out.pringln("s1能转化为数字");
}else{
    System.out.pringln("s1不能转化为数字");
} 

例题:2042. 检查句子中的数字是否递增

2. int与String的互相转化

int -> String

int num = 88; 

// 方式一: 
String s1 = "" + num; 

// 方式二: 
String s2 = String.valueOf(num); 

String -> int

String s = "88";

// 方式一:(推荐)
int num1 = Integer.parseInt(s);

// 方式二:
Integer i1 = Integer.valuOf(s);
int num2 = i1.intValue(i1);

3. 数组相关

3.1 数组排序

// arr: [3, 4, 2, 1, 5]
// 由小到大
public void sort(int[] arr){
    Arrays.sort(arr);
}
// [1,2,3,4,5]

// 由大到小
// 注意,反转的话,要把数组int[]转化为Intger[]
public void sort(Integer[] arr){
    Arrays.sort(arr,Collections.reverseOrder());
}

3.2 数组去重

// 方法一:HashSet
public Integer[] removeDuplicates(int[] arr){
    HashSet<Integer> hashSet = new HashSet<>();
    for(int i=0; i<arr.length; i++){
        hashSet.add(arr[i]);
    }
    return hashSet.toArray(new Integer[hashSet.size()]);
}
// 方法二:ArrayList
public Integer[] removeDuplicates(int[] arr){
    List<Integer> list = new ArrayList<>();
    for(int i=0; i<arr.length; i++){
        if(!list.contains(arr[i])){
            list.add(arr[i]);
        }
    }
    return list.toArray(new Integer[list.size()]);
}

3.3 数组反转

使用Colleactions.reverse() 方法

public void reverse(Integer[] arr){
    Collections.reverse(Arrays.asList(arr));
    System.out.println(Arrays.asList(arr));
}

3.4 数组切片

Arrays.copyOfRange(int[] arr,int from,int to);

public int[] split(int[] arr){
    int[] ints = Arrays.copyOfRange(arr, 1, 2);
    return ints;
}

数组的切片在很多题中,并不复制出子组,而是使用两个指针去指出头和尾,例如滑动窗口。

3.5 数组元素相等

int[] arr1 = new int[]{1,3,5,6};
int[] arr2 = new int[]{5,6,3,1};
Arrays.equals(arr1, arr2) // true

4. String字符串相关

4.1 获取index处的字符

char charAt(int index)

很多题没必要上来就把String用split分割为String数组,可以考虑用chaAt()获取某处的字符char。

4.2 字符串分割split

String[] split(String regex, int limit)

String str = new String("Hello-world-juejin"); 
String[] arr = str.split("-");

// [Hello,world,juejin]

4.3 判断两个字符串相等

不要用==,使用boolean equals(Object anObject)

String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");

System.out(str1 == str2); // true
System.out(str1 == str3); // false
System.out(str1.equals(str3)); // true 

5. 优先队列PriorityQueue

Java中的PriorityQueue,默认是小根堆。

大根堆实现:

        PriorityQueue<Integer> pq = new PriorityQueue<Integer>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });

例题:239. 滑动窗口最大值

6. 随机数

随机生成在某个范围的随机整数

Random random = new Random();
int ran = random.nextInt(max)%(max-min+1)+min;

// 生成一个[5,30]的随机数
Random random = new Random();
int num = random.nextInt(30)%(30-5+1)+5;

后续刷题总结后,还会继续补充~