牛客刷题系列之进阶版(搜索旋转排序数组,链表内指定区间反转)

@[toc](每日一题)
> 很多小伙伴为了刷题发愁
> 今天为大家推荐一款刷题神奇哦:[刷题面试神器牛客](https://www.nowcoder.com/link/pc_csdncpt_xfh_sf)
> 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官


# 一:搜索旋转排序数组
## 1.题目
[题目链接](https://leetcode.cn/problems/search-in-rotated-sorted-array/solution/sou-suo-xuan-zhuan-pai-xu-shu-zu-by-leetcode-solut/)
![在这里插入图片描述](https://img-blog.csdnimg.cn/84650bdc9c6f4ea0beb2d260b8af8b55.png)


## 2.代码实现

```cpp
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left=0;
        int right =nums.size()-1;
        int mid;
        while(left<=right)
        {
            mid = (left+right)/2;

            if(nums[0]>target)//当t在右边的数组时
            {
                if(nums[mid]>=nums[0]) //当mid左边时,需要将left=mid+1
                nums[mid] = -10001;
            }
            else//当t在左边的数组时
            {
                if(nums[mid] < nums[0]) //当mid右边时,需要将right = mid-1;
                 nums[mid] = 10001;
            }

            if(nums[mid] > target)
               right = mid-1;
            else if(nums[mid] <target)
              left = mid+1;
              else
              return mid;
        }
         return -1;
    }
};
```

## 3.思路和注意事项
* 思路是模拟二分查找来实现的
1. 普通的二分查找是 
    if(nums[mid] > target)
               right = mid-1;
            else if(nums[mid] <target)
              left = mid+1;
              else
              return mid;
 2. nums[mid] > target时,   right = mid-1; 所以我们可以用 nums[mid] = 10001;来模拟 这种情况。
 3. 当我们找到在特殊情况下的right 要变成mid-1时,我们就可以用 nums[mid] = 10001;来模拟 这种情况。
 4. 具体的情况看代码注释(主要是看mid和t在哪一边)
  ![在这里插入图片描述](https://img-blog.csdnimg.cn/b72b7a488c7a4e15ad0c3e23fcfdc5e5.png)


# 二:链表内指定区间反转
## 1.题目
[题目链接](https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c?tpId=188&&tqId=38555&rp=1&ru=/activity/oj&qru=/ta/job-code-high-week/question-ranking)
![在这里插入图片描述](https://img-blog.csdnimg.cn/55f6f91ec279435e9f47fbff856e9044.png)

## 2.代码实现

```cpp
/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        // write code here
        ListNode* res =new ListNode(0);
        ListNode* cur = head;
        ListNode* pre = res;
        res->next= head;
        for(int i=1;i<m;i++)
        {
            pre =cur;
            cur =cur->next;
        }
        for(int i=m;i<n;i++)
        {
           ListNode* tem =cur->next;
            cur->next = tem->next;
            tem->next  =   pre->next;
            pre->next = tem;
        }
        return res->next;;
    }
};
```

## 3.思路和注意事项

> 主要思路就是一次一次的反转
* 需要注意的是要设虚拟头节点,以防头节点的改变的情况
# ps

> 想和博主一样刷优质面试和算法题嘛,快来[刷题面试神器牛客](https://www.nowcoder.com/link/pc_csdncpt_xfh_sf)吧,期待与你在牛客相见



全部评论
这题我也刷过
点赞 回复 分享
发布于 2022-08-21 22:22 陕西

相关推荐

家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
实习与准备秋招该如何平衡
点赞 评论 收藏
分享
06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务