• 笔试题积累


    1、二叉树的前序遍历:

    1. public class Solution {
    2. /**
    3. * @param root TreeNode类
    4. * @return int整型一维数组
    5. */
    6. public void preorder(java.util.List list, TreeNode root) {
    7. if (root == null) { //遇到空节点则返回
    8. return;
    9. }
    10. list.add(root.val); // 先遍历根节点
    11. preorder(list, root.left); // 再去左子树
    12. preorder(list, root.right); // 再去右子树
    13. }
    14. public int[] preorderTraversal (TreeNode root) {
    15. // 添加遍历结果的数组
    16. java.util.List list = new ArrayList();
    17. // 递归前序遍历
    18. preorder(list, root);
    19. int[] arr = new int[list.size()]; //新建数组
    20. for (int i = 0; i < arr.length; i++) {
    21. arr[i] = list.get(i);
    22. }
    23. return arr;
    24. }
    25. }

    2、二叉树的中序遍历:

    1. import java.util.*;
    2. /*
    3. * public class TreeNode {
    4. * int val = 0;
    5. * TreeNode left = null;
    6. * TreeNode right = null;
    7. * public TreeNode(int val) {
    8. * this.val = val;
    9. * }
    10. * }
    11. */
    12. public class Solution {
    13. /**
    14. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    15. *
    16. *
    17. * @param root TreeNode类
    18. * @return int整型一维数组
    19. */
    20. public void inorder(java.util.List list, TreeNode root) {
    21. if (root == null) { //遇到空节点则返回
    22. return;
    23. }
    24. inorder(list, root.left); // 再去左子树
    25. list.add(root.val); // 先遍历根节点
    26. inorder(list, root.right); // 再去右子树
    27. }
    28. public int[] inorderTraversal (TreeNode root) {
    29. // 添加遍历结果的列表
    30. List list = new ArrayList();
    31. // 递归中序遍历
    32. inorder(list, root);
    33. int[] arr = new int[list.size()]; //新建数组
    34. for (int i = 0; i < arr.length; i++) {
    35. arr[i] = list.get(i);
    36. }
    37. return arr;
    38. }
    39. }

    3、二叉树的后续遍历

    1. import java.util.*;
    2. public class Solution {
    3. public void postorder(List treelist, TreeNode root) {
    4. if (root == null) {
    5. return;
    6. }
    7. postorder(treelist, root.left);
    8. postorder(treelist, root.right);
    9. treelist.add(root.val);
    10. }
    11. //后续遍历
    12. public int[] postorderTraversal (TreeNode root) {
    13. // 后续遍历,先创建一个list
    14. List treeList = new ArrayList();
    15. postorder(treeList, root); // 递归遍历
    16. int[] arr = new int[treeList.size()];
    17. for (int i = 0; i < arr.length; i++) {
    18. arr[i] = treeList.get(i);
    19. }
    20. return arr;
    21. }
    22. }

    4、反转链表:

    (1)简单的方法是用双链表进行求解:

    1. /*
    2. public class ListNode {
    3. int val;
    4. ListNode next = null;
    5. ListNode(int val) {
    6. this.val = val;
    7. }
    8. }*/
    9. public class Solution {
    10. public ListNode ReverseList(ListNode head) {
    11. // 双链表求解
    12. ListNode newHead = null; // 新链表
    13. while (head != null) {
    14. // 先保存访问节点的下一个结点,保存起来(留着下一步访问)
    15. ListNode temp = head.next;
    16. // 每次访问的原链表结点都会成为新链表的头结点;其实就是把新链表挂到访问的原链表结点后面就行
    17. head.next = newHead;
    18. newHead = head;
    19. // 重新赋值,继续访问
    20. head = temp;
    21. }
    22. return newHead;
    23. }
    24. }

    (2)复杂点的用stack(栈)

    1. public ListNode ReverseList(ListNode head) {
    2. Stack stack = new Stack<>();
    3. //把链表节点全部摘掉放到栈中
    4. while (head != null) {
    5. stack.push(head);
    6. head = head.next;
    7. }
    8. if (stack.isEmpty())
    9. return null;
    10. ListNode node = stack.pop();
    11. ListNode dummy = node;
    12. //栈中的结点全部出栈,然后重新连成一个新的链表
    13. while (!stack.isEmpty()) {
    14. ListNode tempNode = stack.pop();
    15. node.next = tempNode;
    16. node = node.next;
    17. }
    18. //最后一个结点就是反转前的头结点,一定要让他的next
    19. //等于空,否则会构成环
    20. node.next = null;
    21. return dummy;
    22. }

    5、字符串变形

    1. public String trans(String s, int n) {
    2. // 字符串变形
    3. if (s.length() == 0){
    4. return s;
    5. }
    6. String a[] = s.split(" ", -1); // 这个-1很重要
    7. System.out.println(a.length);
    8. // 字符数组result
    9. char[] result = new char[n];
    10. int num = 0; //数字num=0,用来记录操作
    11. for (int i = a.length-1; i >= 0; i--) { //逆向看
    12. //遍历string数组的 一项字符串
    13. for (char c:a[i].toCharArray()) {
    14. result[num++] = Character.isUpperCase(c)? Character.toLowerCase(c):Character.toUpperCase(c);
    15. }
    16. if (i!=0) {
    17. result[num++] = ' '; //添加一个空格
    18. }
    19. }
    20. // System.out.println(num);
    21. return String.valueOf(result);
    22. }

    6、最长公共前缀

    1. import java.util.*;
    2. public class Solution {
    3. /**
    4. *
    5. * @param strs string字符串一维数组
    6. * @return string字符串
    7. */
    8. public String longestCommonPrefix(String[] strs) {
    9. //边界条件判断
    10. if (strs == null || strs.length == 0)
    11. return "";
    12. //默认第一个字符串是他们的公共前缀
    13. String pre = strs[0];
    14. int i = 1;
    15. while (i < strs.length) {
    16. //不断的截取
    17. while (strs[i].indexOf(pre) !=
    18. 0) // indexOfindexOf用于返回[目标字符串]在[源字符串]中的位置,如果此字符串中没有这样的字符,则返回 -1
    19. pre = pre.substring(0, pre.length() -
    20. 1); //如果不是共同前缀的话,那么说明pre太长,从右向左减一位
    21. i++;
    22. }
    23. return pre;
    24. }
    25. }

    7、用两个栈来实现队列

    1. import java.util.Stack;
    2. public class Solution {
    3. // 用两个栈实现队列
    4. Stack stack1 = new Stack(); //定义stack
    5. Stack stack2 = new Stack();
    6. public void push(int node) {
    7. stack1.push(node); // 将值插入进第一个栈中
    8. }
    9. public int pop() {
    10. if (stack2.size() <= 0) {
    11. while (stack1.size() != 0) {
    12. stack2.push(
    13. stack1.pop()); // 置换一下;队列是先进先出,而栈则是先进后出
    14. }
    15. }
    16. return stack2.pop();
    17. }
    18. }

    8、包含min函数的栈

    1. import java.util.Stack;
    2. public class Solution {
    3. Stackstack1 = new
    4. Stack(); //新建一个栈对象:用来存正常的数值
    5. Stackstack2 = new
    6. Stack(); //新建一个栈对象:用来栈顶存放最小值(排序好的)
    7. // 包含min函数的栈:Min表示获取此时栈中最小元素
    8. public void push(int node) {
    9. stack1.push(node); //将value压入栈stack1中
    10. if (stack2.size() == 0 ||
    11. stack2.peek() > node) { //比栈顶元素大的,我们就不压入
    12. stack2.push(node);
    13. } else {
    14. stack2.push(stack2.peek()); //重复加入min值,因为统一pop
    15. }
    16. }
    17. public void pop() {
    18. stack1.pop(); //弹出栈顶元素
    19. stack2.pop();
    20. }
    21. public int top() {
    22. return stack1.peek(); //查看栈顶元素
    23. }
    24. public int min() {
    25. return stack2.peek(); //查看栈顶元素
    26. }
    27. }

    9、有效括号序列

    1. import java.util.*;
    2. public class Solution {
    3. /**
    4. *
    5. * @param s string字符串
    6. * @return bool布尔型
    7. */
    8. public boolean isValid (String s) {
    9. // 判断字符串是否合法?
    10. char[] s_char = s.toCharArray();
    11. Stackstack1 = new Stack(); //新建一个栈
    12. for (int i = 0; i < s_char.length; i++) {
    13. if (s_char[i] == '[') {
    14. stack1.push(']'); //如果是左括号的话,那么栈压入右括号
    15. } else if (s_char[i] == '(') {
    16. stack1.push(')');
    17. } else if (s_char[i] == '{') {
    18. stack1.push('}');
    19. } else if (stack1.isEmpty() ||
    20. s_char[i] != stack1.pop()) { //1、栈为空,说明第一个字符错了; 2、如果右括号,则比较栈顶
    21. return false;
    22. }
    23. }
    24. return stack1.isEmpty(); //如果是空的话,则说明没问题
    25. }
    26. }

    10、滑动窗口的最大值

    1. import java.util.*;
    2. public class Solution {
    3. public ArrayList maxInWindows(int [] num, int size) {
    4. if (size == 0) {//避免size为0时候报错
    5. ArrayList list1 = new ArrayList(); //新建一个
    6. return list1;
    7. }
    8. // 给定一个长度为n的数组,滑动窗口的大小size,找出所有滑动窗口里数值的最大值
    9. int n_hua = num.length - size + 1; //滑动窗口数量
    10. ArrayList list1 = new
    11. ArrayList(); //新建一个Integer数组
    12. int max_window = 0; //统计每轮滑动窗口最大值
    13. for (int i = 0; i < n_hua; i++) {
    14. for (int j = i; j < i + size; j++) {
    15. if (j == i) {
    16. max_window = num[j];
    17. } else {
    18. if (num[j] > max_window) { //当出现小于最大值的时候
    19. max_window = num[j];
    20. }
    21. }
    22. }
    23. list1.add(max_window);
    24. }
    25. return list1;
    26. }
    27. }

    11、最小的k个数

     用Python的话,很简单(不得不说,处理数组还是Python比较流氓):

    1. # @param input int整型一维数组
    2. # @param k int整型
    3. # @return int整型一维数组
    4. #
    5. class Solution:
    6. def GetLeastNumbers_Solution(self, input: List[int], k: int) -> List[int]:
    7. if k==0 or len(input)==0:
    8. list1 = [] # 返回空数组
    9. return list1
    10. else:
    11. input.sort() # 数组排序
    12. return input[:k] # 输出前k位

    用Java:

    1. import java.util.ArrayList;
    2. import java.util.*;
    3. public class Solution {
    4. public ArrayList GetLeastNumbers_Solution(int [] input, int k) {
    5. ArrayList list1 = new ArrayList(); //新建ArrayList
    6. if(k==0||input.length==0){
    7. return list1; //返回空值
    8. }
    9. Arrays.sort(input); // 对数组input进行排序(且记是Arrays)
    10. for (int i=0; i
    11. list1.add(input[i]); // 塞到新建的Arraylist中
    12. }
    13. return list1;
    14. }
    15. }

    12、寻找第k大的数

     Python依然简单粗暴:

    1. # @param a int整型一维数组
    2. # @param n int整型
    3. # @param K int整型
    4. # @return int整型
    5. #
    6. class Solution:
    7. def findKth(self, a: List[int], n: int, K: int) -> int:
    8. # 找出数组中第 k 大的数
    9. if K == 0 or n == 0:
    10. list1 = [] # 返回空数组
    11. return list1
    12. else:
    13. a.sort() # 数组排序
    14. a.reverse() # 数组反转
    15. return a[K-1] # 输出前k位

    Java的话:

    1. import java.util.*;
    2. public class Solution {
    3. public int findKth(int[] a, int n, int K) {
    4. // write code here
    5. if(n==0){
    6. return 0;
    7. }
    8. Arrays.sort(a); //对数组a进行排序
    9. return a[n-K];
    10. }
    11. }

    13、数据流中的中位数

     Java的写法:

    1. import java.util.*; //需要单独写一个包
    2. public class Solution {
    3. ArrayList list1 = new ArrayList(); // 新建一个列表
    4. public void Insert(Integer num) {
    5. if (list1.isEmpty()) {
    6. list1.add(num); // 如果列表没数据,则进行插入
    7. } else {
    8. int i = 0; //这里就是把i单拉出来的目的是 方便插入操作
    9. for (; i < list1.size(); i++) { //列表求长度是size()
    10. if (num < list1.get(i)) {
    11. break;
    12. }
    13. }
    14. list1.add(i, num); // 插入相应位置
    15. }
    16. }
    17. public Double GetMedian() {
    18. // 该方法:获取当前读取数据的中位数
    19. if (list1.size() % 2 == 0) { //偶数的话
    20. int n = list1.size() / 2;
    21. double a = list1.get(n); //获取中间靠右的值
    22. double b = list1.get(n - 1); //获取中间靠左的值
    23. return (a + b) / 2;
    24. } else {
    25. int n = list1.size() / 2;
    26. double a = list1.get(n); //获取中间的值
    27. return a;
    28. }
    29. }
    30. }

    14、两个整型数组求交集

    1. import java.util.*; //其中Arrays、HashSet以及set都在util里边
    2. public int[] intersection(int[] nums1, int[] nums2) {
    3. Set set1 = new HashSet<>(); // 用到了哈希表(去重问题)
    4. for (int i=0;i
    5. set1.add(nums1[i]);
    6. }
    7. Set resSet = new HashSet<>(); //收集一致的数字
    8. for (int j=0;j
    9. if (set1.contains(nums2[j])){
    10. resSet.add(nums2[j]); //把b中数字,a中存在的放到哈希表中
    11. }
    12. }
    13. int[] res = new int[resSet.size()];
    14. int k = 0;
    15. for (Integer v : resSet){ // 把哈希表中内容,赋值给int[]
    16. res[k] = v;
    17. k++;
    18. }
    19. return res;
    20. }

    15、两个整型数组求并集

    1. import java.util.*; //其中Arrays、HashSet以及set都在util里边
    2. //Integer的默认值是null, int是0.因此用Integer还是比较合适的
    3. public Integer[] intersection(int[] nums1, int[] nums2) {
    4. Set set1 = new HashSet<>(); // 用到了哈希表(去重问题)
    5. for (int i = 0; i < nums1.length; i++) {
    6. set1.add(nums1[i]);
    7. }
    8. for (int i = 0; i < nums2.length; i++) {
    9. set1.add(nums2[i]);
    10. }
    11. //将set转换成int
    12. Integer[] unionArray = {};
    13. unionArray = set1.toArray(unionArray);
    14. // printing the union of two arrays.
    15. System.out.println( "Union of two arrays: " + Arrays.toString(unionArray));
    16. return unionArray;
    17. }

  • 相关阅读:
    vue中的 this.$refs,this.$emit,this.$store,this.$nextTick 的使用
    pat倒数3天
    springboot集成nacos并实现自动刷新
    Android Studio 插件开发5、多语言
    RK3588平台开发系列讲解(安卓篇)Android12 获取 root 权限
    亚马逊美国站灯具UL认证灯串UL588认证办理
    Excel打开第二个文件很慢的解决方法
    selenium+python web自动化测试框架项目实战实例教程
    (PTA乙级)1045 快速排序 (单调栈思想)
    参加霍格沃兹测试开发学社举办的火焰杯软件测试开发大赛是一种什么体验?
  • 原文地址:https://blog.csdn.net/xielang13/article/details/126935116