秋招突击——7/17——复习{二分查找——搜索插入位置、搜索二维矩阵,}——新作{链表——反转链表和回文链表,子串——和为K的子数组}

文章目录

    • 引言
    • 新作
      • 二分模板
      • 二分查找——搜索插入位置
        • 复习实现
      • 搜索二维矩阵
        • 复习实现
    • 新作
      • 反转链表
        • 个人实现
        • 参考实现
      • 回文链表
        • 个人实现
        • 参考实现
      • 和为K的子数组
        • 个人实现
        • 参考实现
    • 总结

引言

  • 今天算法得是速通的,严格把控好时间,后面要准备去面试提前批了,项目得赶紧过!
  • 今天复习一个模板,然后在整理一个模板!

新作

二分模板

 void binSearch(int[] nums,int l,int r){while(l<r){int mid = (l + r + 1) >> 1;if(nums[mid] >= tar) l = mid;else r = mid - 1;	

二分查找——搜索插入位置

  • 题目链接
  • 第一次做
  • 第二次做
复习实现
  • 这里是使用左边界的
class Solution {public int searchInsert(int[] nums, int tar) {int l = 0,r = nums.length - 1;while(l < r){int mid = (l + r) >> 1;if(nums[mid] > tar) r = mid;  else if(nums[mid] == tar) return mid;else l = mid + 1;}if(nums[l] < tar)   return l + 1;return l ;}
}

在这里插入图片描述
右边界

class Solution {public int searchInsert(int[] nums, int tar) {int l = 0,r = nums.length - 1;while(l < r){int mid = (l + r + 1) >> 1;if(nums[mid] < tar) l = mid;  else if(nums[mid] == tar) return mid;else r = mid - 1;}System.out.println(r);if(nums[r] < tar)   return l + 1;return r ;}
}

在这里插入图片描述

搜索二维矩阵

  • 题目链接
  • 第一次做
复习实现
  • 这道题两种实现方式,一种是做两次二分查找,不过要明确好使用左边界还是右边界,是找第一个小的值还是第一个大的值,然后再确定是否存在,不存在直接跳出。这种比较耗时。
  • 还有一种坐标转换,将所有的元素排成一个序列,然后从左到右进行查询,确定到具体的目标是转成对应二维矩阵的信息,进行比较!
class Solution {public boolean searchMatrix(int[][] mat, int tar) {// define the row and col of arrayint m = mat.length;int n = mat[0].length;// binSearch on the conversion of the indexint l = 0;int r = m * n - 1;while(l < r){int mid = (l + r) >> 1;if(mat[mid / n][ mid % n] >= tar)   r = mid;else l = mid + 1;}return mat[l / n][ l % n] == tar;}
}

在这里插入图片描述

我靠,这样写,出奇的顺利,差不多五分钟就写完了!

新作

反转链表

题目链接
在这里插入图片描述

个人实现
  • 这个就是常规的反转链表,很常见!

在这里插入图片描述

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {// handle the edge situationif(head == null || head.next == null)   return head;// define dummy head to store the head nodeListNode dummy = new ListNode();dummy.next = head;// reverse the node listListNode left = dummy.next;ListNode right = left.next;ListNode temp = right.next;left.next = null;while(temp != null){right.next = left;left = right;right = temp;temp = temp.next;}right.next = left;left = right;dummy.next = right;return dummy.next;        }
}

在这里插入图片描述

写是写出来了,但是太散了,还是要参考一下啊

参考实现
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {// handle the edge situationif(head == null || head.next == null)   return head;// define dummy head to store the head nodeListNode dummy = new ListNode();dummy.next = head;// reverse the node listListNode left = null;ListNode right = dummy.next;;while(right != null){ListNode temp = right.next;right.next = left;left = right;right = temp;}dummy.next = left;return dummy.next;        }
}

总结

  • 其实我的代码有很多重复的地方,完全没有必要,总结下来:
    • 反转链表两节点,next和pre,临时保存用temp,最终返回是pre

在这里插入图片描述

回文链表

题目链接

在这里插入图片描述

注意

  • 链表节点数最少为1,直接返回
  • 链表的值不用担心越界
  • 要求时间复杂度是O(n),空间复杂度是O(1)
个人实现
  • 这个是回文链表,也就双指针可以做,因为空间复杂度是O(1),并没有办法使用其他的数据结构,所以想想看,双指针怎么遍历。
    • 如果节点数是奇数,一定不会是回文字符串,直接返回false
    • 如果节点数是偶数,那么就要找到中间的节点数,直接将字符串进行拼接,然后再用反转不就行了!
  • 遍历一遍,保存为字符串,先判定数量,数量一致,在使用字符串的操作。
  • 看错了,回文是从前往后读,和从后往前读是一致的!
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public boolean isPalindrome(ListNode head) {ListNode temp = head;StringBuilder  str = new StringBuilder("");// traverse the list and judge the length while(temp != null){str.append("" + temp.val);temp = temp.next;}String substr1 = str.toString();//System.out.println(substr1 );String substr2 = str.reverse().toString();//System.out.println(substr2 );return substr1.equals(substr2);}
}

在这里插入图片描述

问题
将int转成String

  • String.valueOf(4);
  • Integer.toString(4);
  • “” + 4

StringBuilder的相关操作

  • 添加元素:append,可以添加char,int还有string
  • 删除元素:delete(start_idx,end_idx),删除这段索引之间的字符串
  • 转为String:toString
  • 获取子串:substring(start_idx,end_idx),注意,一定要是小写
  • 获取长度:length(),除了collection是用size,其他都是使用length,不过string系列的要加括号
  • 字符串比较相等,使用equals,不要使用==,需要转为string
  • 字符串反转,reverse(),只能使用stringBuilder进行调用

这题做的不容易,补充了好多知识,真不容易!

参考实现
  • 参考样例实现了三个方法

方法一

  • 将数组保存为数组,然后的使用双指针进行反向遍历,跟我的很像。

方法二

  • 使用栈实现逆序遍历,然后正向读取数据,然后的入栈,在逐个出栈,就是反向遍历单链表了。

方法三——快慢指针

  • 两倍快指针到了终点,然后慢指针就是中点
  • 反转两个链表,分别进行比较,然后再反转回来!

逆序遍历出栈入栈,确定中点快慢指针

和为K的子数组

  • 题目链接

在这里插入图片描述
注意

  • 必须要连续的序列,并且不能为空
  • 可以为1个,可能是两个
  • k是目标值,不会越界
  • 数组是没有任何顺序的
个人实现
  • 数组没有任何顺序,所以不能使用两数之和的方式进行计算,这里得想办法,表示一下两者的关系。
  • 这里没有对时间复杂度做出要求,所以我们可以尝试直接暴力搜索去做。
  • 实现思路如下
    • 将前i项的序列保存为字典,O(n)
    • 遍历每一个索引,并在字典中找到对应的索引值,找到了就符合条件,找不到跳过。O(n*n),最坏是平方。
      • S[k] - S[i] = k,i<k
class Solution {public int subarraySum(int[] nums, int k) {// res == result int res = 0;// define the array to store the value of the sumint m = nums.length;int[] sumN = new int[m];sumN[0] = nums[0];// handle the special situationif(m == 1 && nums[0] != k)  return 0;Map<Integer,List<Integer>> map = new HashMap<>();List<Integer> tempZero = new ArrayList<Integer>();tempZero.add(0);map.put(nums[0],tempZero);if(nums[0] == k)    res ++;//System.out.println(map.get(nums[0]).toString());for(int i = 1;i < m;i ++)   {sumN[i] = nums[i] + sumN[i - 1];//System.out.println(sumN[i]);List<Integer> temp = map.getOrDefault(sumN[i],new ArrayList<Integer>());temp.add(i);map.put(sumN[i],temp);if(sumN[i] == k)    res ++;}System.out.println(res);// traverse the array to judge list for(int r = 0;r < m;r ++){int resTar = sumN[r] - k;if(map.containsKey(resTar)){for(int x : map.get(resTar)){if(x < r)   res ++;}   }}return res;}
}

在这里插入图片描述

整了半个小时,就整出来这么几个东西,尴尬,超时了!

问题
Arrays.asList和ArrayList并不兼容,会出错

  • Arrays.asList返回的是一个固定长度,然后ArrayList是返回一个不定长动态数组,这两个互不兼容,所以不能实现如下操作
List<Integer> temp = Arrays.asList(1);
temp.add(1)

new ArrayList (0):并不会创建一个包含元素零的Arraylist,会出错!

  • new ArrayList(x):是返回一个初始长度为x的列表,并不是返回一个有0的ArrayList,可以使用如下方式创建
  • new ArrayList(Arrays.asList(1,2,3,0)):创建了包含四个元素的数组
参考实现
  • 基本思路是一致的,但是我有一个地方没有考虑到,浪费了很多时间,具体如下。针对索引为i的目标而言,我只需要一个包含前i-1的前缀和序列就行,并不需要包含后续的,我添加的元素的过程不就是这样吗?但是我是先把所有的元素都添加完,然后再过滤的,这就是一个很大的问题!
  • 边保存,边计算
    在这里插入图片描述
class Solution {public int subarraySum(int[] nums, int k) {// res == result int res = 0;// define the array to store the value of the sumint m = nums.length;int[] sumN = new int[m];sumN[0] = nums[0];// handle the special situationif(m == 1 && nums[0] != k)  return 0;Map<Integer,Integer> map = new HashMap<>();//List<Integer> tempZero = new ArrayList<Integer>();//tempZero.add(0);map.put(nums[0],1);if(nums[0] == k)    res ++;//System.out.println(map.get(nums[0]).toString());for(int i = 1;i < m;i ++)   {sumN[i] = nums[i] + sumN[i - 1];// judge fron 1 to i int resTar = sumN[i] - k;res += map.getOrDefault(resTar,0);map.put(sumN[i],map.getOrDefault(sumN[i],0) + 1);if(sumN[i] == k)    res ++;}return res;}
}

在这里插入图片描述

这就过了,关键是怎么记忆?

字串和哈希,边算边添加

总结

  • 老是会把问题想复杂,然后明明能做出来的,但是会超时,不应该这样的!
  • 又做了那么久的算法,下午还得补专利,估计没啥时间弄项目了,不行呀!
  • 又是一个深夜,今天晚上去看电影了,过了一遍百度的一个面经,然后做了几道算道题,有投了两家公司,但是专利还是没有写,明天上午先写专利,在做项目,然后的再刷算法!

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

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

相关文章

C语言实例-约瑟夫生者死者小游戏

问题&#xff1a; 30个人在一条船上&#xff0c;超载&#xff0c;需要15人下船。于是人们排成一队&#xff0c;排队的位置即为他们的编号。报数&#xff0c;从1开始&#xff0c;数到9的人下船&#xff0c;如此循环&#xff0c;直到船上仅剩15人为止&#xff0c;问都有哪些编号…

C语言 | Leetcode C语言题解之第260题只出现一次的数字III

题目&#xff1a; 题解&#xff1a; int* singleNumber(int* nums, int numsSize, int* returnSize) {int xorsum 0;for (int i 0; i < numsSize; i) {xorsum ^ nums[i];}// 防止溢出int lsb (xorsum INT_MIN ? xorsum : xorsum & (-xorsum));int type1 0, type2…

【Mysql】Docker下Mysql8数据备份与恢复

[TOC] 【Mysql】Docker下Mysql8数据备份与恢复 1 创建Mysql容器 格式 docker run -d --name容器名称 -p 宿主端口号:3306 -e MYSQL_ROOT_PASSWORDmysql密码 -e MYSQL_PASSWORDmysql密码 -e TZAsia/Shanghai -v 宿主目录-数据:/var/lib/mysql -v 宿主目录-备份数据:/back…

多态性概念 OOPS

大家好&#xff01;今天&#xff0c;我们将探讨面向对象编程 (OOP) 中的一个基本概念 - 多态性。具体来说&#xff0c;我们将重点介绍其三种主要形式&#xff1a;方法重载、方法覆盖和方法隐藏。对于任何使用 OOP 语言&#xff08;例如 C#&#xff09;的程序员来说&#xff0c;…

NET 语言识别,语音控制操作、语音播报

System.Speech. 》》System.Speech.Synthesis; 语音播报 》》System.Speech.Recognition 语音识别 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Speech.Recog…

mac二进制安装operator-sdk

0. 前置条件 1. 安装go 安装步骤略。 1. 下载operator-sdk源码包 https://github.com/operator-framework/operator-sdk 1.1 选择适合当前go版本的operator版本&#xff0c;在operator-sdk/go.mod文件中可以查看Operator-sdk使用的go版本。 2. 编译 源码包下载后&#x…

C语言航空售票系统

以下是系统部分页面 以下是部分源码&#xff0c;需要源码的私信 #include<stdio.h> #include<stdlib.h> #include<string.h> #define max_user 100 typedef struct ft {char name[50];//名字char start_place[50];//出发地char end_place[50];//目的地char …

JAVA 异步编程(线程安全)二

1、线程安全 线程安全是指你的代码所在的进程中有多个线程同时运行&#xff0c;而这些线程可能会同时运行这段代码&#xff0c;如果每次运行的代码结果和单线程运行的结果是一样的&#xff0c;且其他变量的值和预期的也是一样的&#xff0c;那么就是线程安全的。 一个类或者程序…

多线程初阶(二)- 线程安全问题

目录 1.观察count 原因总结 2.解决方案-synchronized关键字 &#xff08;1&#xff09;synchronized的特性 &#xff08;2&#xff09;如何正确使用 语法格式 3.死锁 &#xff08;1&#xff09;造成死锁的情况 &#xff08;2&#xff09;死锁的四个必要条件 4.Java标准…

若依二次开发

口味改造 原&#xff1a; 改造&#xff1a; 1./** 定义口味名称和口味列表的静态数据 */ 2.改变页面样式 3.定义储存当前选中的口味列表数组&#xff0c;定义改变口味名称时更新当前的口味列表 4.改变页面样式 6.格式转换 7.定义口味列表获取焦点时更新当前选中的口味列表

【DGL系列】简单理解graph.update_all和spmm的区别

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景介绍 源码分析 小结一下 背景介绍 我们在看GNN相关的论文时候&#xff0c;都会说到邻接矩阵与特征矩阵之间是用到了spmm&#xff0c;在很久…

深入理解Linux网络(二):UDP接收内核探究

深入理解Linux网络&#xff08;二&#xff09;&#xff1a;UDP接收内核探究 一、UDP 协议处理二、recvfrom 系统调⽤实现 一、UDP 协议处理 udp 协议的处理函数是 udp_rcv。 //file: net/ipv4/udp.c int udp_rcv(struct sk_buff *skb) {return __udp4_lib_rcv(skb, &udp_…

【web】-反序列化-to_string

<?php highlight_file(__FILE__); class A{public $s;public function __destruct(){echo "hello".$this->s;}} class B{public $cmd;public function __toString(){system($this->cmd);return 1;} } unserialize($_GET[code]); __toString()当对象被当着…

《梦醒蝶飞:释放Excel函数与公式的力量》17.1使用命名范围和工作表函数

第17章&#xff1a;使用命名范围和工作表函数 17.1 命名范围的优势 在Excel中&#xff0c;使用命名范围是一个强大且灵活的功能&#xff0c;它可以极大地提高工作效率和公式的可读性。命名范围不仅使公式更容易理解&#xff0c;还减少了错误的可能性。以下将详细介绍命名范围的…

自然语言大模型介绍

1 简介 最近一直被大语言模型刷屏。本文是周末技术分享会的提纲&#xff0c;总结了一些自然语言模型相关的重要技术&#xff0c;以及各个主流公司的研究方向和进展&#xff0c;和大家共同学习。 2 Transformer 目前的大模型基本都是Transformer及其变种。本部分将介绍Transf…

24暑假算法刷题 | Day18 | LeetCode 530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先

目录 530. 二叉搜索树的最小绝对差题目描述题解 501. 二叉搜索树中的众数题目描述题解 236. 二叉树的最近公共祖先题目描述题解 530. 二叉搜索树的最小绝对差 点此跳转题目链接 题目描述 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差…

Python 更换 pip 源详细指南

目录 前言pip 国内源临时换源方法一&#xff1a;添加参数方法二&#xff1a;设置环境变量 永久换源方法三&#xff1a;修改配置方法四&#xff1a;pip 命令修改 总结 前言 在我们使用 Python 3 时&#xff0c;pip 是一个不可或缺的工具&#xff0c;它用于安装和管理第三方库。…

在虚拟机 CentOS7 环境下安装 MySQL5.7 数据库

配置目标 在虚拟机的 Linux CentOS7 环境下安装 MySQL5.7 版数据库&#xff0c;并能从宿主机 Windows 系统连接该数据库&#xff08;默认端口&#xff1a;3306&#xff09;。 1. 准备工作 WMware 虚拟机&#xff1a;VMware Workstation 16 ProCentOS7 镜像&#xff1a;CentO…

基于密钥的身份验证(Linux-Linux)

A主机&#xff1a; 1、生成密钥对 [rootservera ~]# ssh-keygen查看公钥 注&#xff1a;id_rsa为私钥&#xff08;证书&#xff09;&#xff0c;id_rsa.pub为公钥 2、注册公钥到服务器 [rootservera ~]# ssh-copy-id root172.25.250.106 查看.ssh 3、使用密钥连接服务器 #…

【yolov8】3、yolov8 环境安装 【GPU版】

pycharm下载安装 yolov8 环境安装 【GPU版】 1、要求1.1 什么是 CUDA 和 CUDNN1.2 查看cuda版本的3种方法&#xff08;版本在10.2以上的可以忽略本章节&#xff09;&#xff1a;1.3 没有找到NIVDIA图标&#xff0c;确认是否有英伟达显卡 2、pycharm下载安装进入官网 3、yolov8…