手撕代码

Posted lgh544

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手撕代码相关的知识,希望对你有一定的参考价值。

1、筛选数组arr中重复的元素,考虑时间复杂度。

时间复杂度为O(n)

package writtenTest01;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//手写代码:筛选数组arr中重复的元素,考虑时间复杂度。
public class filterDuplicateElements {

    public static void main(String[] args) {
        int[] arr = { 1, 1, 3, 4, 6, 6, 3 };
        List<Integer> res = duplicate(arr);
        System.out.println(res.toString());
    }

    public static List<Integer> duplicate(int[] arr) {
//a数组用来存放结果,b数组用来存放arr中每个元素的个数
int[] b = new int[arr.length]; List<Integer> list = new ArrayList<>();
//遍历arr,如果以arr中元素为下标的的b元素已存在,则该b元素加1,否则设置为1
for (int i = 0; i < arr.length; i++) { if (b[arr[i]] == 0) { b[arr[i]] = 1; continue; } b[arr[i]]++; } int m = 0; for (int i = 0; i < b.length; i++) { if (b[i] > 1) { list.add(i); } } return list; } }

 2、请你说一下BST的特点,并手写代码判断一棵树是不是BST

BST(二叉排序树):

1、每个结点都有一个作为搜索依据的关键码,所有结点的关键码不同

2、左子树上所有结点的关键码小于根节点的关键码

3、右子树所有结点的关键码大于根节点的关键码

4、左子树和右子树也是BST

判断一棵树是不是BST

class Node {
int data;
Node left;
Node right;
}
public class BSTChecker {
private static int lastVisit = Integer.MIN_VALUE;
public static boolean isBST(Node root) {
if(root == null) return true;


boolean judgeLeft = isBST(root.left); // 先判断左子树


if(root.data >= lastVisit && judgeLeft) { // 当前节点比上次访问的数值要大

lastVisit = root.data;
} else {
return false;
}


boolean judgeRight = isBST(root.right); // 后判断右子树

return judgeRight;
}
}

 

以上是关于手撕代码的主要内容,如果未能解决你的问题,请参考以下文章

算法手撕代码131~140

算法手撕代码91~100

算法手撕代码141~150

算法手撕代码121~130

算法手撕代码86~90

算法手撕代码111~120