当前位置: 首页 > news >正文

牛客网经典Java面试常见题

在这里插入图片描述

个人主页:熬夜磕代码丶
作品专栏: 数据结构与算法
我变秃了,也变强了
给大家介绍一款程序员必备刷题平台——牛客网
点击注册一起刷题收获大厂offer吧
在这里插入图片描述

文章目录

  • 一、二叉搜索树与双向链表
  • 二、从尾到头打印链表
  • 三、调整数组奇数位于偶数前面
  • 四、删除链表的节点
  • 五、 只出现一次的数字

一、二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
在这里插入图片描述
注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
4.你不用输出双向链表,程序会根据你的返回值自动打印输出

在这里插入图片描述

public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
       if(pRootOfTree == null) {
           return null;
       }
       createLinkedList(pRootOfTree);
       while(pRootOfTree.left != null) {
           pRootOfTree = pRootOfTree.left;
       }
       return pRootOfTree;
    }
    TreeNode prev = null;
    public  void createLinkedList(TreeNode pRootOfTree) {
        if(pRootOfTree == null) {
            return;
        }
        createLinkedList(pRootOfTree.left);
        pRootOfTree.left = prev;
        if(prev != null) {
            prev.right = pRootOfTree;
        }
        prev = pRootOfTree;
        createLinkedList(pRootOfTree.right);
    }
}

二、从尾到头打印链表

输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
题目地址:从尾到头打印链表
在这里插入图片描述

在这里插入图片描述

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(listNode == null) {
            return list;
        }
        ListNode cur = listNode.next;
        listNode.next = null;
        while(cur != null) {
            ListNode curNext = cur.next;
            cur.next = listNode;
            listNode = cur;
            cur = curNext;
        }
        while(listNode != null) {
            list.add(listNode.val);
            listNode = listNode.next;
        }
        return list;
    }
}

三、调整数组奇数位于偶数前面

输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
在这里插入图片描述
在这里插入图片描述

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型一维数组 
     * @return int整型一维数组
     */
    public int[] reOrderArray (int[] array) {
        int[] arr = new int[array.length];
        int k = 0;
        for(int i = 0;i < array.length;i++) {
            if(array[i] % 2 == 1) {
                arr[k++] = array[i];
            }
        }
        for(int i = 0;i < array.length;i++) {
            if(array[i] % 2 == 0) {
                arr[k++] = array[i];
            }
        }
        return arr;
    }
}

四、删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

1.此题对比原题有改动
2.题目保证链表中节点的值互不相同
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
题目地址:从尾到头打印链表
在这里插入图片描述
在这里插入图片描述

public ListNode deleteNode (ListNode head, int val) {
        if(head == null) {
            return head;
        }
        if(head.val == val) {
            return head.next;
        }
        ListNode fast = head.next;
        ListNode slow = head;
        while(fast != null) {
            if(fast.val == val) {
                slow.next = fast.next;
                break;
            }else {
                slow = slow.next;
                fast = fast.next;
            }
        }
        return head;
    }

五、 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
方法1 : 异或

public int singleNumber(int[] nums) {
        int x = 0;
        for(int i = 0;i < nums.length;i++) {
            x ^= nums[i];
        }
        return x;
    }

方法2: HashSet

class Solution {
    public int singleNumber(int[] nums) {
        HashSet<Integer> hashSet = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            if(hashSet.contains(nums[i])) {
                hashSet.remove(nums[i]);
            }else {
                hashSet.add(nums[i]);
            }
        }
        for (int i = 0; i < nums.length; i++) {
            if(hashSet.contains(nums[i])) {
                return nums[i];
            }
        }
        return -1;
    }
}

相关文章:

  • 如何选择最适合自己的地图软件
  • 【DDR3 控制器设计】(3)DDR3 的写操作设计
  • 拦截器的运行流程分析(项目源码寻踪)
  • 如何让不给听得歌乖乖听话?python教你如何做...
  • 【微服务40】分布式事务Seata源码解析八:AT模式下本地事务的执行流程
  • 面试汇总(一)
  • 分布式任务调度XXL-JOB-第二章-SpringBoot集成XXL-JOB
  • Linux系统下查看被杀死进程的信息
  • 粒子群算法PSO求解最大值和最小值案例(超详细注释)
  • LeetCode每日一题——902. 最大为 N 的数字组合
  • Java学习--JDBC
  • C++中GDAL批量创建多个栅格图像文件并批量写入数据
  • 基于maven的spring项目实现登录注册(SSM)
  • 【C++】动态内存管理
  • 波士顿动力再惊艳!机器人大秀男团舞,举手投足人味满满,多次转卖后展示新标签...
  • #Java异常处理
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [deviceone开发]-do_Webview的基本示例
  • 【Linux系统编程】快速查找errno错误码信息
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Android组件 - 收藏集 - 掘金
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • k8s 面向应用开发者的基础命令
  • LintCode 31. partitionArray 数组划分
  • Octave 入门
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PermissionScope Swift4 兼容问题
  • SpiderData 2019年2月13日 DApp数据排行榜
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Zepto.js源码学习之二
  • 大型网站性能监测、分析与优化常见问题QA
  • 汉诺塔算法
  • 老板让我十分钟上手nx-admin
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 原生js练习题---第五课
  • 栈实现走出迷宫(C++)
  • 追踪解析 FutureTask 源码
  • ​ArcGIS Pro 如何批量删除字段
  • #HarmonyOS:Web组件的使用
  • #Linux(权限管理)
  • #在 README.md 中生成项目目录结构
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)(1.13) SiK无线电高级配置(五)
  • (12)Hive调优——count distinct去重优化
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (9)目标检测_SSD的原理
  • (C++20) consteval立即函数
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Git) gitignore基础使用
  • (二十三)Flask之高频面试点
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (四)模仿学习-完成后台管理页面查询
  • (太强大了) - Linux 性能监控、测试、优化工具