【刷题笔记】之牛客面试必刷TOP101(二分查找-I + 二维数组中的查找 + 寻找峰值 + 数组中的逆序对 + 旋转数组的最小数字 + 比较版本号)

news2024/11/26 9:44:03

目录

1. 二分查找-I

2. 二维数组中的查找

3. 寻找峰值

4. 数组中的逆序对

5.  旋转数组的最小数字

6. 比较版本号


1. 二分查找-I

题目链接:二分查找-I_牛客题霸_牛客网 (nowcoder.com)

题目要求:

上代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int search (int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        while(left <= right) {
            int mid = (right+left)/2;
            if(target > nums[mid]) {
                left = mid + 1;
            }else if(target < nums[mid]) {
                right = mid - 1; 
            }else{
                return mid;
            }
        }
        return -1;
    }
}

2. 二维数组中的查找

题目链接:二维数组中的查找_牛客题霸_牛客网 (nowcoder.com)

题目要求:

 题目分析:

(1)暴力法

这个是我自己写的方法,就是直接暴力做的,外面一个 for 遍历行,里面一个 while 进行 每一行中的二分查找,时间复杂度是(m + logn) 空间复杂度O(1)

上代码

public class Solution {
    public boolean Find(int target, int [][] array) {
        for(int i = 0; i < array.length; i++) {
            int left = 0, right = array[0].length-1;
            while(left <= right) {
                int mid = (left + right)/2;
                if(target < array[i][mid]) {
                    right = mid - 1; 
                }else if(target > array[i][mid]) {
                    left = mid + 1;
                }else if(target == array[i][mid]){
                    return true;
                }
            }
        }
        return false;
    }
}

(2)线性查找 

然后看了一下别人的方法,主要就是从 右上角开始找,或左下角开始找

比如从 右上角开始找   ,题中说了,每行 每列 都是依次增加的 

这种方法一个while就可以,时间复杂度低 O(m+n),同理 如果从左下角开始走也一样

上代码

        public boolean Find(int target, int [][] array) {
            if(array == null || array.length == 0 || array[0].length == 0) {
                return false;
            }
            int rows = 0; //行
            int column = array[0].length - 1; //列
            while(rows < array.length && column >= 0) {
                if(array[rows][column] == target) {
                    return true;
                }else if(array[rows][column] < target) {
                    rows++;
                }else {
                    column--;
                }
            }
            return false;
    }
}

3. 寻找峰值

题目链接:寻找峰值_牛客题霸_牛客网 (nowcoder.com)

题目要求:

 题目分析:

(1)暴力法

题中说的是 峰值元素 是大于右边元素,和左边元素的

如果只是 根据条件,进行for循环遍历数组(注意不要数组越界的问题),发现测试用例不能全部跑过去,

出现了比如【2,9】峰值9,返回下标1;比如【9,2】峰值9,返回下标1

所以还要判断的一种情况是,

如果for循环遍历到最后,还没出现峰值,那么就是单调递增(此时判断后两个元素大小),峰值就是最后一个

如果for循环遍历到最后,还没出现峰值,那么就是单调递减(此时判断前两个元素大小),峰值就是第一个

这么写的原因是题中说 nums[-1] = nums[n] = 负无穷,也就是走到数组边界外时,是最小的

所以还要判断的一种情况就是 数组边界是不是 “峰值” 的问题

import java.util.*;


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

(2)二分法 

这个我看别人写的,是用 二分法做的,

找到数组中间节点mid,如果中间节点小于右边,说明峰值在右边,left就要收缩到mid+1

如果中间节点大于右边,说明峰值可能是mid自己,也可能是mid左边,right就要收缩到mid

到while 结束后,此时left 和 right 相等,随便返回谁都可以

        public int findPeakElement (int[] nums) {
            int left = 0;
            int right = nums.length - 1;
            while(left < right) {
                int mid = (left + right) / 2;
                //右边大,峰值在右 
                if(nums[mid] < nums[mid+1]) {
                    left = mid + 1;
                }else {
                    //左边大,峰值在左(也可能峰值就是自己)
                    right = mid;
                }
            }
            return right;
        }

4. 数组中的逆序对

题目链接:数组中的逆序对_牛客题霸_牛客网 (nowcoder.com)

题目要求:

题目分析:

题意就是,在数组中, 如果前一个数字 大于 后一个数字, 就计数+1,直到最后,就%1000000007

既然是要比较这样数组中每两个数字的大小,那就直接暴力两两比较

(1) 暴力

上代码

import java.util.*;

public class Solution {
    public int InversePairs(int [] array) {
        if(array.length == 0 || array.length == 1) {
            return 0;
        }
        int fast = 1;
        int slow = 0;
        long count = 0;
        while(slow < array.length-1) {
            if(array[slow] > array[fast]) {
                count++;
            }
            fast++;
            if(fast == array.length) {
                slow++;
                fast = slow + 1;
            }
        }
        return (int)(count%1000000007);
    }
}

(2) 归并

因为这里的思路和归并一样,所以代码部分就是写个归并排序,然后在归并排序中进行合并比较时,前面大的时候,进行count计数(这里加的是前半部分剩余元素的个数)

具体归并代码也可以看看我这篇博客

http://t.csdn.cn/gqmuP

import java.util.*;

public class Solution {
    long count = 0;
    public int InversePairs(int [] array) {
        mergeSort(array, 0, array.length-1);
        return (int)(count%1000000007);
    }
    //分割
    private void mergeSort(int[] array, int left, int right) {
        if(left >= right) {
            return;
        }
        int mid = left + (right - left)/2;
        mergeSort(array,left,mid);
        mergeSort(array,mid+1,right);
        merge(array,left,right,mid);
    }
    private void merge(int[] array, int start, int end, int midIndex) {
        int[] tmpArr = new int[end-start+1];//辅助数组
        int k = 0;//tmpArr数组下标
        int s1 = start;
        int s2 = midIndex+1;
        while(s1 <= midIndex && s2 <= end) {
            if(array[s1] <= array[s2]) {
                tmpArr[k++] = array[s1++];
            }else {
                //多加这行代码,进行计数 
                count += (midIndex-s1+1);
                tmpArr[k++] = array[s2++];
            }
        }
        while(s1 <= midIndex) {
            tmpArr[k++] = array[s1++];
        }
        while(s2 <= end) {
            tmpArr[k++] = array[s2++];
        }
        //将排好序的辅助数组拷贝回去
        for(int i = 0; i < k; i++) {
            array[i+start] = tmpArr[i];
        }
    }
}

5.  旋转数组的最小数字

题目链接:旋转数组的最小数字_牛客题霸_牛客网 (nowcoder.com)

题目要求:

题目分析:

上代码

public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int left = 0;
        int right = array.length-1;
        while(left < right) {
            int mid = (left + right)/2;
            //此时最小的数字在右边
            if(array[mid] > array[right]) {
                left = mid + 1;
                //无法判断在右边哪里,一个一个试
            }else if(array[mid] == array[right]) {
                right--;
            }else {
                //最小数组在左边
                right = mid;
            }
        }
        return array[left];
    }
}

6. 比较版本号

题目链接:比较版本号_牛客题霸_牛客网 (nowcoder.com)

题目要求:

 题目分析:

(1) 分割截取

可以利用split将.进行分割,转为字符串数组

因为版本号长度不一, 要进行比较的话,可以将短的版本号,后面取0 方便比较

下面就是将字符串数组中的每个字符串元素,转为整数进行比较了

上代码

import java.util.*;


public class Solution {
    public int compare (String version1, String version2) {
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");
        for(int i = 0; i < v1.length || i < v2.length; i++) {
            //较短的版本号后面取0
            String str1 = i < v1.length ? v1[i] : "0";
            String str2 = i < v2.length ? v2[i] : "0";
            int v11 = Integer.parseInt(str1);
            int v22 = Integer.parseInt(str2);
            //比较数字大小
            if(v11 > v22) {
                return 1;
            }
            if(v11 < v22) {
                return -1;
            }
        }
        return 0;
    }
}

(2) 双指针遍历截取比较

import java.util.*;


public class Solution {
    public int compare (String version1, String version2) {
        int n1 = version1.length();
        int n2 = version2.length();
        int i = 0, j = 0;
        while(i < n1 || j < n2) {
            //截取version1的.前面的数字
            long num1 = 0;
            while(i < n1 && version1.charAt(i) != '.') {
                num1 = num1*10 + (version1.charAt(i) - '0');
                i++;
            }
            //跳过.
            i++;
            long num2 = 0;
            while(j < n2 && version2.charAt(j) != '.') {
                num2 = num2*10 + (version2.charAt(j) - '0');
                j++;
            }
            j++;
            if(num1 > num2) {
                return 1;
            }
            if(num1 < num2) {
                return -1;
            }
        }
    return 0;
    }
}
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring MVC学习 | 视图RESTFul

文章目录一、视图1.1 视图对象View1.2 ThymeleafView1.3 转发视图1.4 重定向视图1.5 视图控制器二、RESTFul2.1 简介2.2 PUT和DELETE请求的实现2.2.1 HiddenHttpMethodFilter过滤器2.2.2 实现PUT请求2.2.3 实现DELETE请求学习视频&#x1f3a5;&#xff1a;https://www.bilibil…

Python 元组(Tuple)操作详解

Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改,元组使用小括号,列表使用方括号,元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可 一、创建元组 代码如下: 1 2 3 tup1 (physics, chemistry, 1997, 2000); tup2 (1, 2, 3, 4, 5 ); tup3 &qu…

Redis实现朋友圈,微博等Feed流功能,实现Feed流微服务(业务场景、实现思路和环境搭建)

文章目录业务场景Feed流相关概念Feed流特征Feed流分类实现思路环境搭建数据库表结构新建Feeds功能微服务ms-feeds配置类 RedisTemplateConfigurationREST配置类 RestTemplateConfigurationFeeds 实体类FeedsVO 响应类业务场景 在互联网领域&#xff0c;尤其现在的移动互联网时…

Linux环境下MySQL的安装与使用

目录 一&#xff1a;安装MYSQL说明 1.1 查看是否安装过MySQL 1.2 MYSQL的卸载 二&#xff1a;MySQL在Linux下的安装 三&#xff1a;MYSQL登录 3.1 首次登录 3.2 修改密码 3.3 设置远程登录 一&#xff1a;安装MYSQL说明 1.1 查看是否安装过MySQL 检查rpm安装包 rpm -…

JAVA毕业设计——基于ssm高校共享单车管理系统 (源代码+数据库)604

代码地址 https://github.com/ynwynw/webike-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于ssm高校共享单车管理系统 (源代码数据库)604 一、系统介绍 用户管理&#xff0c;服务点管理&#xff0c;单车管理&#xff0c;分类管理&#xff0c;学生管…

基于java+springboot+mybatis+vue+mysql的大学生体质测试管理系统

项目介绍 随着我国大学生数量的不断增加&#xff0c;个个高校对大学生的体质也开始高度的进行重视&#xff0c;只有拥有了高强健康体质的大学生才能够全身心的投入到学习和工作中&#xff0c;为了能够更好的对大学生的体质进行检测我们通过java编程语言&#xff0c;后端采用sp…

redis之哨兵机制

0. 前言 我们知道&#xff0c;只有主库才能有写操作&#xff0c;而从库只能进行读操作&#xff0c;那么当主库宕机后&#xff0c;如何保证服务的正常进行呢&#xff1f; 本文主要介绍的是 Redis 提供的哨兵机制&#xff0c;通过哨兵监控主库的状况&#xff0c;如果发现主库下…

Python迭代法Iteration的讲解及求解海藻问题、方程问题实战(超详细 附源码)

一、迭代法简介 迭代法&#xff08;iteration&#xff09;是现代计算机求解问题的一种基本形式。迭代法与其说是一种算法&#xff0c;更是一种思想&#xff0c;它不像传统数学解析方法那样一步到位得到精确解&#xff0c;而是步步为营&#xff0c;逐次推进&#xff0c;逐步接近…

[附源码]Python计算机毕业设计高校本科毕业及资料存档管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

十二、JavaScript——其他数据类型

布尔值 &#xff08;boolean&#xff09;- 布尔值主要用于进行逻辑判断 - 布尔值只有两个 true 和 false (不用加引号) 空指 (null) - 空值用来表示空对象 - 空指只有一个 NULL - 用typeof检查空值时返回object 未定义 &…

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

记一次蚂蚁金服Java程序员面试经历&#xff08;均为交叉面&#xff09; ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 一面 自我介绍 项目中的监控&#xff1a;那个监控指标常见的有哪些&#xff1f; 微服务涉及到的技术以及需要…

数据模型篇之大数据领域建模综述

第8章 大数据领域建模综述 1.为什么需要数据建模 为了更好的将数据进行有序、有结构地分类组织和存储。数据模型就是数据组织和存储方法&#xff0c;它强调从业务、数据存取和使用角度合理存储数据。 数据建模的好处&#xff1a; 性能&#xff1a;良好的数据模型能帮助我们快…

4款国产实用软件,只因功能强大,常被误认为是外国人开发的

过去常听说国外的XXX好&#xff0c;国外的月亮一定更圆&#xff0c;国产软件一样很良心&#xff0c;然而由于偏见&#xff0c;却被误认为是外国人开发的&#xff0c;闹出笑话。 1、Cruiser EXP Alpha 这是我见过最强大的电脑工具箱&#xff0c;没有之一&#xff0c;收纳了超120…

被新华社技术局点名!中国电信这个“黑盒子”干啥了?

全媒体时代&#xff0c;新闻报道又快又好&#xff0c;需要先进技术提供有力支撑。近日&#xff0c;中国电信收到新华社通信技术局感谢信&#xff0c;点赞中国电信5G商企专网产品&#xff0c;基于5G专线进行点对点快速组网&#xff0c;实现了前方报道重要节点物理线路的“空天备…

Springboot整合EasyExcel,实现Excel文件上传

一、概念 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 它能让你在不用考虑性能、内存的等因素的情况下&#xff0c;快速完成Excel的读、写等功能。EasyExcel是在尽可能节约内存的情况下支持读写百M的Excel。 二、Excel的上传(读Excel) 1.E…

Spring Batch 批处理-作业增量参数

引言 接着上篇&#xff1a;Spring Batch 批处理-作业参数校验&#xff0c;了解作业参数校验后&#xff0c;本篇就来了解一下Spirng Batch 作业增量参数。 作业增量参数 不知道大家发现了没有&#xff0c;每次运行作业时&#xff0c;都改动作业名字&#xff0c;或者改动作业的…

php就业招聘系统mysql数据库web结构计算机软件工程网页wamp

一、源码特点 PHP就业招聘系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环 境为PHP APACHE&#xff0c;数据库为mysql5.0&#xff0c;使用php语言开发。 php就…

【C00098】基于SSM的校园疫情防控管理系统——可视化大屏

基于SSM的校园疫情防控管理系统——可视化大屏项目简介项目获取开发环境项目技术运行截图注意&#xff1a;2022年最新款&#xff0c;全网唯一&#xff01;&#xff01; 先到先得&#xff01;&#xff01; 项目简介 基于ssm框架开发的校园疫情防控管理系统共分为四个角色&…

非零基础自学Golang 第6章 Go语言内置容器 6.3 映射

非零基础自学Golang 文章目录非零基础自学Golang第6章 Go语言内置容器6.3 映射6.3.1 声明映射6.3.2 初始化映射6.3.3 遍历映射6.3.4 从映射中删除键值对第6章 Go语言内置容器 6.3 映射 映射&#xff08;map&#xff09;是一种无序的键值对的集合&#xff0c;map的键类似于索引…

聚观早报 | 特斯拉上线Steam平台;苹果CEO库克访问索尼

今日要闻&#xff1a;特斯拉上线Steam平台&#xff1b;苹果CEO库克访问索尼&#xff1b;三星向华为转让多项专利&#xff1b;NASA将在太空调查水资源&#xff1b;传推特拖欠总部租金数周特斯拉上线Steam平台 12 月 14 日消息&#xff0c;特斯拉已经为其ModelS和ModelX电动汽车上…