首页 > 其他 > 详细

面试必考真题top1-10

时间:2020-10-02 00:17:38      阅读:54      评论:0      收藏:0      [点我收藏+]

1.反转链表

public class Solution {
    public ListNode ReverseList(ListNode head) {
        ListNode curr = head;
        ListNode pre = null;
        while(curr!=null){
            ListNode next = curr.next;
            curr.next = pre;
            pre = curr;
            curr = next;
        }
        return pre;
    }
}

思路:

首先需要定义一个pre空节点,作为反转前头节点的指向节点。

循环中,首先要保存一下当前节点的下一个节点为next,再改变curr节点的指向(反转操作)。

反转后,依次移动pre,curr。

最后一次循环后,curr已经指向空,因此跳出循环,返回pre(反转后的头节点)

 

2.请实现有重复数字的有序数组的二分查找。

输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。
public class Solution {
    public int upper_bound_ (int n, int v, int[] a) {
        if(v>a[n-1]) return n+1;
        int l=0,h=n-1;
        while(l<h){
            int m = l+(h-l)/2;
            if(a[m]<v){
                l = m+1;
            }else{
                h = m;
            }
        }
        return l+1;       
    }
}

思路:n是数组长度,v是指定的数。

这道题主要是可能存在重复数字,要求输出在数组中第一个大于等于查找值的位置。

因此只要遍历到的数等于或者大于指定值,都要继续缩小范围继续查找。

因为遍历到的数等于指定值时,有可能它左边还有一串跟它一样的数,因此需要再次二分查找直到找到第一个比它小的数。

最后返回l+1,也就是第一个大于等于查找值的位置。

面试必考真题top1-10

原文:https://www.cnblogs.com/augenstern/p/13758966.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!