测试开发备战秋招面试6-牛客刷题二分查找/排序篇

news/2024/11/24 2:24:36/

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧!

目录

1、二分查找-I

2、二维数组的查找

3、寻找峰值

4、数组中的逆序对

5、旋转数组的最小数字

6、比较版本号


1、二分查找-I

题目链接:二分查找-I_牛客题霸_牛客网
思路:双指针实现即可。

Java版:

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

Python:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @param target int整型 
# @return int整型
#
class Solution:def search(self , nums: List[int], target: int) -> int:# write code herelow = 0high = len(nums)if low == high:return -1 while low <= high:mid = (low + high) >> 1if nums[mid] > target:high = mid - 1elif nums[mid] < target:low = mid + 1else:return mid return -1 

2、二维数组的查找

题目链接:二维数组中的查找_牛客题霸_牛客网

思路:从右上角开始搜索,不断的往左或者往下走即可,时复:O(M+N),空复:O(1)

Java版:

public class Solution {public boolean Find(int target, int [][] array) {/** for(int i=0; i<array.length; i++){for(int j=0; j<array[0].length; j++){if(array[i][j] == target){return true ;}}}return false ;*///从右上角开始线性搜索int left = 0, right = array[0].length-1 ;while(left < array.length && right >=0){if(array[left][right] == target){return true ;}else if(array[left][right] > target){right -- ;}else{left ++ ;}}return false ;}
}

Python版:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param target int整型 
# @param array int整型二维数组 
# @return bool布尔型
#
class Solution:def Find(self , target: int, array: List[List[int]]) -> bool:# write code herei = 0j = len(array[0]) - 1 while i < len(array) and j >= 0:if array[i][j] == target:return Trueelif array[i][j] > target:j = j - 1else:i = i + 1 return False

3、寻找峰值

题目链接:寻找峰值_牛客题霸_牛客网

思路:有点二分的意思,就是从中间往两边跑,左边大往左边跑,右边大往右边跑。
Java版:
 

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型一维数组 * @return int整型*/public int findPeakElement (int[] nums) {// write code here//这个找波峰有个寻找逻辑,从中间开始找,右边大于左边,往右招,反之,往左找到int left = 0, right = nums.length-1 ;while(left < right){int mid = (left + right) >> 1 ;if(nums[mid] > nums[mid+1]){right = mid ;}else{left = mid + 1;}}return right ;}
}

4、数组中的逆序对

题目链接:数组中的逆序对_牛客题霸_牛客网

思路:先划分,后合并,合并后并排序,同时计算逆序对。分而治之的思想。

Java版:

public class Solution {int cnt = 0 ;public int InversePairs(int [] array) {//先分后治,先划分为每个分组只有一个元素,然后合并统计逆序并排序mergeSort(array, 0, array.length-1) ;return cnt ;}public void mergeSort(int [] array, int left, int right){int mid = (left + right) >> 1 ;if(left < right){mergeSort(array,left, mid ) ;mergeSort(array, mid+1, right) ;merge(array, left,mid, right) ;}}public void merge(int []array, int left, int mid, int right){int [] tmp = new int [right - left + 1] ;int l = left, r = mid + 1;int c = 0 ;while(l<=mid && r<=right){if(array[l] <= array[r]){tmp[c++] = array[l++];}else{tmp[c++] = array[r++] ;cnt += mid - l + 1 ;cnt %= 1000000007 ;}}while(l<=mid){tmp[c++] = array[l++] ;}while(r<=right){tmp[c++] = array[r++] ;}int s = left ;for(int num:tmp){ //每次排序后需要回传到原来的数组中array[s++] = num;}}
}

Python版:

class Solution:def InversePairs(self , data: List[int]) -> int:# write codeglobal  cc = 0self.mergeSort( data,   0, len(data) - 1)return cdef mergeSort(self, data : List[int],   left:int, right:int) :mid = (left + right) >> 1if(left < right):self.mergeSort( data,  left, mid)self.mergeSort(data,  mid+1, right)self.merge(data,  left, mid, right)def merge(self, data : List[int],  left:int, mid:int, right:int):global cr = mid + 1l = lefti = 0lst = [0 for x in range(right-left+1)]while l<=mid and r<=right:if data[l] <= data[r]:lst[i] = data[l]l = l + 1else:lst[i] = data[r]c = c + mid - l + 1c = c % 1000000007r = r + 1i = i + 1while l<=mid:lst[i] = data[l]i = i + 1l = l + 1while r<=right:lst[i] = data[r]i = i + 1r = r + 1j = leftfor v in lst:data[j] = vj = j + 1

5、旋转数组的最小数字

题目链接:旋转数组的最小数字_牛客题霸_牛客网

思路:二分思想,将中间的和最右边的比较,然后缩小搜索区间即可。

Java版:

import java.util.ArrayList;
public class Solution {public int minNumberInRotateArray(int [] array) {//二分思想int left = 0, right = array.length - 1 ;while(left < right){int mid = (left + right) >> 1 ;if(array[mid] > array[right]){left = mid + 1;}else if(array[mid] < array[right]){right = mid;}else{right -- ;}}return array[left] ;}
}

6、比较版本号

题目链接:比较版本号_牛客题霸_牛客网
思路:以.号为截取点,每次截取转成整数,然后对比即可。

Java版:

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 比较版本号* @param version1 string字符串 * @param version2 string字符串 * @return int整型*/public int compare (String version1, String version2) {// write code hereint len1 = version1.length(), len2 = version2.length() ;int i=0, j=0 ;while(i<len1 || j<len2){int num1 = 0 ;while(i<len1 && version1.charAt(i) != '.'){num1 = num1 * 10 + (version1.charAt(i++) - '0') ; }i ++ ;int num2 = 0 ;while(j<len2 && version2.charAt(j) != '.'){num2 = num2 * 10 + (version2.charAt(j++) - '0') ;}j ++ ;if(num1 > num2){return 1 ;}if(num1 < num2){return -1 ;}}return 0 ;}
}

http://www.ppmy.cn/news/59559.html

相关文章

新形势下,如何进行智慧园区移动应用建设?

智能化工园区通过信息化实现工业管理的数字化和网络化&#xff0c;实现对生产过程的全面监控和实时数据采集。这使企业能够更好地管理&#xff0c;及时发现问题并采取相应的措施来降低成本。此外&#xff0c;智慧化管理提高了企业资源的使用效率&#xff0c;避免浪费和重复利用…

JavaScript:数组---双指针法

文章目录 双指针法27.移除元素为什么返回值是整数&#xff0c;但输出的答案是数组&#xff1f;双指针法 977.有序数组的平方暴力法&#xff1a;先平方再排序双指针法 总结双指针 双指针法 27.移除元素 为什么返回值是整数&#xff0c;但输出的答案是数组&#xff1f; 双指针法…

c++ 入门概述

c 入门概述 1. c 关键字2. c 命名空间3. c 输入与输出4. c 缺省参数5. c 函数重载6. c 引用6.1 引用概念6.2 引用特性6.3 常引用6.4 引用与指针区别 7. c 内联函数8. c auto 关键字9. 范围 for 循环 1. c 关键字 c 98中&#xff0c;规定的关键字总共有63个&#xff1a; 2. c…

Java时间类(三) -- Calendar()(日历类)

java.util.Calendar类是一个抽象类,它提供了日期计算的相关功能、获取或设置各种日历字段的方法。 protected Calendar() 构造方法为protected修饰,无法直接创建该对象。1. Calendar()的常用方法: 方法名说明static Calendar getInstance()使用默认时区和区域获取日历vo…

Java 网络编程 —— ServerSocket 详解

构造 ServerSocket ServerSocket 的构造方法有以下几种重载形式 ServerSocket() throws IOException ServerSocket(int port) throws IOException ServerSocket(int port, int backlog) throws IOException ServerSocket(int port, int backlog, InetAddress bindAddr) throw…

数据发送流程

在发送模式下&#xff0c;UART 的串行数据发送电路主要包括一个发送移位寄存器(TSR)&#xff0c;TSR 功能是将数据 逐个移位送出。待发数据必须先写到发送缓冲区中。 TXIFx 是发送中断标志位&#xff0c;可配置为发送缓冲区空或TSR 空。 数据的发送支持7bit 、8bit 或9bit 数据…

HTML(四) -- 多媒体设计

目录 1. 视频标签 2. 音频标签 3. 资源标签&#xff08;定义媒介资源 &#xff09; 1. 视频标签 属性值描述autoplayautoplay如果出现该属性&#xff0c;则视频在就绪后马上播放。controlscontrols表示添加标准的视频控制界面&#xff0c;包括播放、暂停、快进、音量等…

缓存击穿,穿透,雪崩

一、缓存穿透 是用户访问的数据既不在缓存当中&#xff0c;也不在数据库中。 如果从数据库查询不到数据&#xff0c;则不写入缓存。这就导致每次请求都会到数据库进行查询&#xff0c;缓存也失去了意义。 当高并发或有人利用不存在的Key频繁攻击时&#xff0c;数据库的压力骤…