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

news2024/9/21 19:07:33

文章目录

    • 引言
    • 新作
      • 二分模板
      • 二分查找——搜索插入位置
        • 复习实现
      • 搜索二维矩阵
        • 复习实现
    • 新作
      • 反转链表
        • 个人实现
        • 参考实现
      • 回文链表
        • 个人实现
        • 参考实现
      • 和为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 array
        int m = mat.length;
        int n = mat[0].length;

        // binSearch on the conversion of the index
        int 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 situation
        if(head == null || head.next == null)   return head;
        
        // define dummy head to store the head node
        ListNode dummy = new ListNode();
        dummy.next = head;

        // reverse the node list
        ListNode 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 situation
        if(head == null || head.next == null)   return head;
        
        // define dummy head to store the head node
        ListNode dummy = new ListNode();
        dummy.next = head;

        // reverse the node list
        ListNode 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 sum
        int m = nums.length;
        int[] sumN = new int[m];
        sumN[0] = nums[0];

        // handle the special situation
        if(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 sum
        int m = nums.length;
        int[] sumN = new int[m];
        sumN[0] = nums[0];

        // handle the special situation
        if(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.coloradmin.cn/o/1933150.html

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

相关文章

Camera Raw:首选项

Camera Raw 首选项 Preferences提供了丰富的配置选项&#xff0c;通过合理设置&#xff0c;可以显著提升图像处理的效率和效果。根据个人需求调整这些选项&#xff0c;有助于创建理想的工作环境和输出质量。 ◆ ◆ ◆ 打开 Camera Raw 首选项 方法一&#xff1a;在 Adobe Bri…

nginx 编译安装与配置

一、安装 官网下载合适的版本&#xff0c;建议选择稳定版本。 官网地址&#xff1a;https://nginx.org wget https://nginx.org/download/nginx-1.26.1.tar.gz -C /opt/ 解压后&#xff0c;进入源码目录 cd /opt/nginx-1.26.1tar -zxvf nginx-1.20.1.tar.gz cd nginx-1.26.1源…

react基础样式控制

行内样式 <div style{{width:500px, height:300px,background:#ccc,margin:200px auto}}>文本</div> class类名 注意&#xff1a;在react中使用class类名必须使用className 在外部src下新建index.css文件写入你的样式 .fontcolor{color:red } 在用到的页面引入…

睿考网:2024注册会计师考试考试在即,如何备考?

2024年注册会计师考试即将开始&#xff0c;准考证打印时间安排在8月5日至20日&#xff0c;每天上午8点至晚上8点&#xff0c;考生要确保在规定时间内完成准考证的打印。 注册会计师考试包含六个科目&#xff0c;每个科目都有其独特的特点和难度。考生需要根据各科目的特性采用…

vue3使用弹幕插件

1.安装插件 $ npm install vue3-danmaku --save 2.用法 <template><vue-danmaku v-model:danmus"danmus" loop style"height:100px; width:300px;"></vue-danmaku> </template><script setup> import vueDanmaku from vu…

Docker构建LNMP环境并运行Wordpress平台

1.准备Nginx 上传文件 Dockerfile FROM centos:7 as firstADD nginx-1.24.0.tar.gz /opt/ COPY CentOS-Base.repo /etc/yum.repos.d/RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c make && \useradd -M -s /sbin/nologin nginx && \cd /o…

数据分析01——系统认识数据分析

1.数据分析的全貌 1.1观测 1.1.1 观察 &#xff08;1&#xff09;采集数据 a.采集数据&#xff1a;解析系统日志 当你在看视频的时候———就会产生日志———解析日志———得到数据 b.采集数据&#xff1a;埋点获取新数据&#xff08;自定义记录新的信息&#xff09; 日志…

redis之resp界面连接

解压资源 连接成功

目标检测入门:4.目标检测中的一阶段模型和两阶段模型

在前面几章里&#xff0c;都只做了目标检测中的目标定位任务&#xff0c;并未做目标分类任务。目标检测作为计算机视觉领域的核心人物之一&#xff0c;旨在从图像中识别出所有感兴趣的目标&#xff0c;并确定它们的类别和位置。现在目标检测以一阶段模型和两阶段模型为代表的。…

【spring boot】初学者项目快速练手

一小时带你从0到1实现一个SpringBoot项目开发_哔哩哔哩_bilibili 一、基础知识 1.注解 二、简介 三、项目结构 四、代码结构 1.生成Spring Boot项目的主程序 &#xff08;1&#xff09;在官网下载 Spring Initializr 快速生成一个初始的项目代码&#xff0c;会生成一个de…

Java二十三种设计模式-抽象工厂模式(3/23)

抽象工厂模式&#xff1a;复杂系统的灵活构建者 引言 在软件开发中&#xff0c;抽象工厂模式是一种提供接口以创建相关或依赖对象族的创建型设计模式。这种模式允许客户端使用一个共同的接口来创建不同的产品族&#xff0c;而无需指定具体类。 基础知识&#xff0c;java设计模…

SSE(Server Sent Event)实战(3)- Spring Web Flux 实现

上篇博客 SSE&#xff08;Server Sent Event&#xff09;实战&#xff08;2&#xff09;- Spring MVC 实现&#xff0c;我们用 Spring MVC 实现了简单的消息推送&#xff0c;并且留下了两个问题&#xff0c;这篇博客&#xff0c;我们用 Spring Web Flux 实现&#xff0c;并且看…

MySQL条件查询(DQL)

在此之前先给大家看一下我的表里面的数据&#xff0c;以方便接下来的讲解 还需要大家先熟悉这里面的条件 1.语法 SELECT 字段列表 FROM 表名 WHERE 条件列表 例如 1.查询年龄等于20的员工 select * from emp where age 20; 2.查询年龄小于等于20的员工信息 select * fr…

PPOCRLabel安装及使用

一、环境准备 1、 使用anaconda创建一个Python3.7.x的环境 # 在命令行输入以下命令&#xff0c;创建名为paddle_env的环境 conda create --name paddle_env python3.7 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/输入以下命令可以查看我们所创建的所…

【作业】 贪心算法1

Tips:三题尚未完成。 #include <iostream> #include <algorithm> using namespace std; int a[110]; int main(){int n,r,sum0;cin>>n>>r;for(int i0;i<n;i){cin>>a[i];}sort(a0,an);for(int i0;i<n;i){if(i>r){a[i]a[i-r]a[i];}suma[…

借助Aspose.Note笔记工具,在Java 中更改 OneNote 中的样式

Microsoft OneNote是一款功能强大的笔记工具。学习如何使用 Java 更改样式&#xff0c;将您的 OneNote 体验提升到一个新的水平&#xff01;在本指南中&#xff0c;我们将向您展示如何使用 Java 更改 OneNote 文档中的样式以增强可读性。本指南将为您提供分步说明&#xff0c;以…

k8s集群 安装配置 Prometheus+grafana

k8s集群 安装配置 Prometheusgrafana k8s环境如下&#xff1a;机器规划&#xff1a; node-exporter组件安装和配置安装node-exporter通过node-exporter采集数据显示192.168.40.180主机cpu的使用情况显示192.168.40.180主机负载使用情况 Prometheus server安装和配置创建sa账号&…

【算法/天梯赛训练】天梯赛模拟题集

L1-009 N个数求和 #include <iostream> #include <algorithm>using namespace std;typedef long long ll; const int N 105;typedef struct node {ll x, y; }node; node a[N];ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a; }int main() {int n;cin >>…

三伏天,艾灸这2处,既能祛寒湿、还能补阳气,效果是平时的好几倍~

这周开始&#xff0c;我们就进入了最炎热的三伏天&#xff01;今年的三伏整整40天&#xff0c;高温闷热&#xff0c;汗流浃背&#xff0c;想想都崩溃~ 最热最难熬的这段时间&#xff0c;也是天赐的良机&#xff01;此时阳气达到一年中的鼎盛&#xff0c;人体阳气也最为充沛&…

金航标kinghelm萨科微slkor总经理宋仕强(Huaqiangbei Songshiqiang )为大家介绍连接器时说

金航标kinghelm萨科微slkor总经理宋仕强&#xff08;Huaqiangbei Songshiqiang &#xff09;为大家介绍连接器时说&#xff0c;连接器通常可以分为以下几大类&#xff1a;1. 矩形连接器&#xff0c;这种连接器的外形通常呈矩形&#xff0c;具有较多的接触点&#xff0c;可传输多…