秋招突击——7/12——复习{每日温度、完全平方数、无重复最长子串}——新作{字节面试——控制多线程按照顺序输出}

文章目录

    • 引言
    • 复习
      • 每日温度
        • 复习实现
        • 参考学习
      • 完全平方数
        • 复习实现
        • 参考学习
      • 无重复字符的最长子串
        • 复习实现
        • 参考学习
    • 新作
      • 控制多线程输出
        • Java实现线程——不使用锁实现
        • 使用synchronized关键实现——使用锁实现
        • 使用synchronized、wait和notify关键字实现
    • 总结

引言

  • 今天又要面试字节,不过这次没有上次那么紧张了,平常心,然后去面对就行了,行就行,不行也没有办法撒!反正得好好准备提前批还有秋招的正式批!好好准备吧!
  • 今天多复习几题,整体来说,复习还是挺快的!
  • 对了,今天还得整理一下MySQL中关于锁的相关内容,背八股的时候,总是有点疑惑,今天全过一遍!

复习

每日温度

  • 题目链接
  • 第一次学习链接
复习实现
  • 我记得这道题我是做出来了,然后当时方法和参考方法不同,但是思想大致是相同的,应该要维护两个栈。我是从前往后进行遍历,他是从后往前进行遍历。
  • 整体来说还是很好做的,两个判定情况
    • 当前元素比栈顶元素大,栈内元素弹出,直到一个比他本身大的元素,
    • 当前元素比栈顶元素小,直接入栈。
  • 从后往前进行遍历
class Solution {public int[] dailyTemperatures(int[] tempe) {// define the result arrayint m = tempe.length;int[] res = new int[m];// define the compare stackDeque<Integer> stk = new LinkedList<>();// trasverse the tempestk.push(m - 1);for(int i = m - 2;i >= 0;i --){if(tempe[stk.peek()] > tempe[i]){res[i] = stk.peek() - i ;stk.push(i);}else{while( !stk.isEmpty() && tempe[stk.peek()] <= tempe[i]){stk.pop();}if(!stk.isEmpty())   res[i] = stk.peek() - i;stk.push(i);}}return res;}
}

总结

  • 我这里还调整了蛮久的,不行呀,写出来的代码还那么繁琐!
  • 关于多态有了更加深刻的理解,你要使用队列或者堆栈的功能,就要使用对应的父类接口来承接对应接口实现类的实例对象,才能调用对应的方法。
    • 不要子类直接调用,这样方法太多了,代码可读性也不好!
      在这里插入图片描述
参考学习

参考代码

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temp) {int m = temp.size();vector<int> f(m);stack<int> upst;for(int i = temp.size() - 1;i >= 0;i --){while(!upst.empty() && temp[i] >= temp[upst.top()]) upst.pop();if(upst.size())  f[i] = upst.top() - i;upst.push(i);}return f;}
};

修改之后的代码

  • 确实更加简洁了,继续再弄吧!
class Solution {public int[] dailyTemperatures(int[] tempe) {// define the result arrayint m = tempe.length;int[] res = new int[m];// define the compare stackDeque<Integer> stk = new LinkedList<>();// trasverse the tempefor(int i = m - 1;i >= 0;i --){while( !stk.isEmpty() && tempe[stk.peek()] <= tempe[i])    stk.pop();if(!stk.isEmpty())   res[i] = stk.peek() - i;stk.push(i);}return res;}
}

还是得记录模板,不然做不下去!自己推,根本没有那么多时间!
关于背包集合的问题模板,可以看一下“铅笔大佬”的总结

完全平方数

  • 第一次学习链接
  • 题目链接
复习实现
  • 第二次再看,这个题目就是一个完全背包的问题,背包的物品就是对应的平方数,然后容量就是当前的数字。
class Solution {public int numSquares(int n) {// define the square number of nList<Integer> sqt = new LinkedList<>();for(int i = 1;i * i <= n;i++ )  sqt.add(i * i);// travser all the situation based on the bag problemint[] f = new int[n + 1];Arrays.fill(f,n);int m = sqt.size();for(int i = m - 1;i >= 0;i --){for(int j = n ;j >= sqt.get(i);j --)for(int k = 0;k * sqt.get(i) <= j;k ++)f[j] = Math.min(f[j],f[j - k * sqt.get(i)] + k);}return f[n - 1];}
}

在这里插入图片描述
总结

  • 完全背包的模板没有背下来,没整明白,然后优化模板也没有背下来,不能每次都推导,在浪费时间。
  • 这应该不全是一个完全背包问题,还是不够扎实!

完全背包模板

  • 这多香,往上一套,直接用,可惜你没背出来
  • “找个就放,放满为止;剩余容量,加上价值”
for (int i = 1; i <= n; ++ i)for (int j = v[i]; j <= m; ++ j)f[j] = max(f[j], f[j - v[i]] + w[i]);
参考学习
  • 真的是愚蠢呀,那道题一看到用什么数学定理,你直接跳过了,真行!不是还有完全背包这种解法吗?你不也是没弄好!
  • 完全背包解决!加上模板,直接修改,秒过,这个模板还是得背!
class Solution {public int numSquares(int n) {// define the square number of nList<Integer> sqt = new LinkedList<>();for(int i = 1;i * i <= n;i++ )  sqt.add(i * i);// travser all the situation based on the bag problemint[] f = new int[n + 1];Arrays.fill(f,n);f[0] = 0;int m = sqt.size();for(int i = 0;i < m;i ++){for(int j = sqt.get(i) ;j <= n;j ++)f[j] = Math.min(f[j],f[j - sqt.get(i)] + 1);}return f[n ];}
}

在这里插入图片描述
算法二

  • 这里是使用了两个定理,一个是一个数一定能够4个完全平方数表示,所以这题返回的结果最多就是4,然后的如果满足一个等式,就可以用三个数表示,否则不行,这里就需要记住一个东西

判定一个数是否是完全平方数

// 这是一个完全平放数的判定
Math.pow(Math.sqrt(x),2) == x
  • 其他的直到就行了

无重复字符的最长子串

  • 第一次学习

第二次学习

  • 题目链接

  • 笑死,这是华为笔试的那道题,如果今天是华为的笔试,你能做出来吗?再来呗,不知道你能不能在一个题上跌三次跟头!

复习实现
  • 典型的滑动窗口,并且是不包含重复字符的,使用hash实现,整整,看看能不能做出来
class Solution {public int lengthOfLongestSubstring(String s) {// define dict to remove the multiple wordMap<Character,Integer> dict = new HashMap<>();// travrese the whole sint m = s.length();int res = 0;for(int l = 0,r = 0;r < m;r ++){// judge  wherther the new char is existswhile(dict.getOrDefault(s.charAt(r),0) >= 1) {dict.put(s.charAt(l),dict.get(s.charAt(l)) - 1);l ++;}dict.put(s.charAt(r),dict.getOrDefault(s.charAt(r),0) + 1 );res = Math.max(res,r - l + 1);}return res;}
}

在这里插入图片描述
这里补充了关于String的一些操作

  • 获取字符串的长度 length()
  • 获取某一个特定的字符,chatAt()
  • 获取子串,substring(beignIdx,endIdx);
参考学习
  • 这里完全可以先添加元素,然后在判定,大概的方式是一样的!
int lengthOfLongestSubstring(string s) {unordered_map<char,int> heap;int res = 0;for (int i = 0 ,j = 0; i < s.size(); ++i) {heap[s[i]] ++;while(heap[s[i]] > 1)heap[s[j ++]] --;res = max(res,i - j + 1);}return res;
}

新作

控制多线程输出

  • 线程一,循环输出的1,线程二,循环输出2,线程三,循环输出3,写一个程序,控制这三个线程循环输出1,2,3,1,2,3,…
  • 这个欠缺的知识有点多,一时间不知道怎么弄,这里先补充一下
Java实现线程——不使用锁实现
  • 实现runnable接口的具体类
    • 重写runnable方法,然后在一个thread对象中传入对应的新实例,创建对应线程,然后进行运行
 public static void main(String[] args) {Thread t1 = new Thread(new ThreadTest(1));Thread t2 = new Thread(new ThreadTest(2));Thread t3 = new Thread(new ThreadTest(3));t1.start();t2.start();t3.start();}static class ThreadTest implements Runnable{int num = 0;ThreadTest(int val){num = val;}// define recursive functionprivate void printNum() throws InterruptedException {while(true){System.out.print(num);Thread.sleep(100);}}@Overridepublic void run() {try {printNum();} catch (InterruptedException e) {throw new RuntimeException(e);}}}

下述是直接实现的效果,并不是完全的123顺序,所以这个方法并不合理!
在这里插入图片描述

版本一,通过全局变量实现控制输出的123

  • 这里虽然有多个线程,但是他们都是Main的内部类,以及内部实例,是共享一个静态变量的current,所以通过current进行设置即可!
public class Main {private static int current = 1;public static void main(String[] args) {Thread t1 = new Thread(new ThreadTest(1));Thread t2 = new Thread(new ThreadTest(2));Thread t3 = new Thread(new ThreadTest(3));t1.start();t2.start();t3.start();}static class ThreadTest implements Runnable{int num = 0;ThreadTest(int val){num = val;}// define recursive functionprivate void printNum() throws InterruptedException {while(true){if (current == num){System.out.print(num);current ++;}if(current == 4)    current = 1;Thread.sleep(100);}}@Overridepublic void run() {try {printNum();} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

问题

  • 如果不使用对应锁进行控制,三个线程同时在输出前阻塞,然后输出顺序就没有办法控制了!仅仅是在这个简单程序出问题的概率比较低,如果复杂程序出问题的概率就高了!
使用synchronized关键实现——使用锁实现

synchronized关键字介绍

  • 修饰函数,多个线程只能互斥访问这个函数
  • 修饰代码块,多个线程只能访问特定的代码块(需要使用对象锁)

不使用synchronized实现方法
在这里插入图片描述
使用synchronized方法效果

  • 下文使用了synchronized方法之后的效果
public class Main {private static int current = 1;private static final Object lock = new Object();public static void main(String[] args) {Thread t1 = new Thread(new ThreadTest(1));Thread t2 = new Thread(new ThreadTest(2));Thread t3 = new Thread(new ThreadTest(3));t1.start();t2.start();t3.start();}static class ThreadTest implements Runnable{int num = 0;ThreadTest(int val){num = val;}// define recursive functionprivate void printNum() throws InterruptedException {synchronized (lock){while(true){current ++;System.out.println(current);Thread.sleep(100);}}}@Overridepublic void run() {try {printNum();} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

在这里插入图片描述

使用synchronized、wait和notify关键字实现

具体实现思路

  • 使用state来表示当前应该的打印那个字母,
  • 每一个线程打印字母之后,就要更新state并且唤醒正在等待的线程
public class Main {private static int current = 1;private static final Object lock = new Object();public static void main(String[] args) {Thread t1 = new Thread(new Runnable(){@Overridepublic void run(){for(int i = 0;i < 100;i ++){synchronized(lock){// judge whether th current thread should print the numtry {// if the current thread should not print num ,wait until the current changedwhile (current % 3 != 1) {lock.wait();}System.out.println(1);current ++;lock.notifyAll();}catch(InterruptedException e){e.printStackTrace();}}}}});Thread t2 = new Thread(new Runnable(){@Overridepublic void run() {// traverse 100 timesfor(int i = 0;i < 100;i ++){synchronized(lock){try{while(current % 3 != 2){lock.wait();}System.out.println(2);current ++;lock.notifyAll();}catch(InterruptedException e){e.printStackTrace();}}}}});Thread t3 = new Thread(new Runnable(){@Overridepublic void run(){for(int i = 0;i < 100;i ++){synchronized(lock){try{while(current % 3 != 0) {lock.wait();}System.out.println(3);current ++;lock.notifyAll();}catch(InterruptedException e){e.printStackTrace();}}}}});t1.start();t2.start();t3.start();}}

这里有几个东西还是需要记住的

  • 重写的是Overirde,第一个字母是大写
  • notify和wait是会出现interruptedException异常
  • 打印输出异常信息是e.printStackTrace()

总结

  • 不行,太晚了,今天搞得太晚了,放弃,明天在弄吧,面试完了,整个人又开始放松了,然后开始摆烂了!明天得有好多东西需要补充学习,尤其是多线程编程那里,需要好好补充!趁着周六,加油,好好看看!
  • 今天面试字节应该是凉了,感觉没戏了!
  • 不想了,继续往下做吧!

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

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

相关文章

安全防御,防火墙配置NAT转换智能选举综合实验

一、实验拓扑图 二、实验需求 1、办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 2、分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 3、多出口环境基于带宽比例进行选路&#xff0c;但是&…

DP(3) | 0-1背包 | Java | LeetCode 1049, 494, 474 做题总结(474未完)

1049. 最后一块石头的重量 II 和 LC 416.分割等和子集 类似 思路&#xff08;我没有思路&#xff09;&#xff1a; 两块石头相撞&#xff0c;这里没有想到的一个点是&#xff0c;相撞的两个石头要几乎相似 以示例1为例&#xff0c;stones [2,7,4,1,8,1]&#xff0c;如果从左到…

Collections:专为集合框架而生的工具类

Collections 是 JDK 提供的一个工具类&#xff0c;位于 java.util 包下&#xff0c;提供了一系列的静态方法。 排序操作 reverse(List list)&#xff1a;反转顺序shuffle(List list)&#xff1a;洗牌&#xff0c;将顺序打乱sort(List list)&#xff1a;自然升序sort(List lis…

解答|服务器只能开22端口可以申请IP地址SSL证书吗?

IP地址SSL证书&#xff0c;是一种专门颁发给公网IP地址的SSL证书&#xff0c;而不是常见的基于域名的SSL证书。SSL证书主要用于保障数据在客户端&#xff08;如用户的浏览器&#xff09;和服务器之间传输时的加密性和安全性&#xff0c;以防止数据被截取或篡改。 服务器只能开…

github actions方式拉取docker镜像

参考&#xff1a; https://wkdaily.cpolar.cn/archives/gc 注意github actions提供的免费虚拟机空间有限&#xff0c;空间不足会报错&#xff0c;查看大概语句有10来G 我在workflow file里加了df -h 运行查看磁盘情况&#xff1a; 通过pwd命令&#xff0c;可以知道运行目录/ho…

ETL数据集成丨主流ETL工具(ETLCloud、DataX、Kettle)数据传输性能大PK

目前市面上的ETL工具众多&#xff0c;为了方便广大企业用户在选择ETL工具时有一个更直观性能方面的参考值&#xff0c;我们选取了目前市面上最流行的三款ETL工具&#xff08;ETLCloud、DataX、Kettle&#xff09;来作为本次性能传输的代表&#xff0c;虽然性能测试数据有很多相…

【JavaScript】解决 JavaScript 语言报错:Uncaught TypeError: XYZ is not a function

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 变量或对象属性类型错误2. 函数名拼写错误或覆盖3. 作用域问题导致的函数未定义4. 调用未初始化的函数 四、解决方案与预防措施1. 确保变量类型正确2. 检查拼写错误3. 注意作用域4. 初始化变量 五、示例代码…

C#中的反射

dll和exe文件的区别 用途&#xff1a; .exe&#xff08;可执行文件&#xff09;&#xff1a;是可以直接运行的程序文件。当你双击一个 .exe 文件或在命令行中输入它的名字&#xff0c;操作系统会加载并执行这个程序。 .dll&#xff08;动态链接库&#xff09;&#xff1a;包含…

graphviz subgraph添加边界框

subgraph name 属性必须要以cluster开头。 A Quick Introduction to GraphvizAn awesome tool for software documentation and visualizing graphshttps://www.worthe-it.co.za/blog/2017-09-19-quick-introduction-to-graphviz.html digraph {rankdir"LR"// the n…

【探索Linux】P.39(传输层 —— TCP的三次 “握手” 和四次 “挥手” )

阅读导航 引言一、TCP的三次握手1. 简介2. 图解三次握手3. 名词解释&#xff08;1&#xff09;SYN&#xff08;同步序列编号&#xff09;包&#xff08;2&#xff09;SYN-ACK&#xff08;同步确认&#xff09;包&#xff08;3&#xff09;ACK&#xff08;确认&#xff09;包 4.…

基于matlab的SVR回归模型

1 原理 SVR&#xff08;Support Vector Regression&#xff09;回归预测原理&#xff0c;基于支持向量机&#xff08;SVM&#xff09;的回归分支&#xff0c;其核心思想是通过寻找一个最优的超平面来进行回归预测&#xff0c;并处理非线性回归问题。以下是SVR回归预测原理的系统…

浪潮天启防火墙TQ2000远程配置方法SSL-V偏、L2xx 配置方法

前言 本次设置只针对配置V偏&#xff0c;其他防火墙配置不涉及。建议把防火墙内外网都调通后再进行V偏配置。 其他配置可参考&#xff1a;浪潮天启防火墙配置手册 配置SSLVxx 在外网端口开启SSLVxx信息 开启SSLVxx功能 1、勾选 “启用SSL-Vxx” 2、设置登录端口号&#xff0…

面试内容集合

用例设计方法 &#xff08;一&#xff09;等价类划分  常见的软件测试面试题划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理…

智慧校园毕业管理:全面解读毕业批次功能

在智慧校园的毕业管理系统中&#xff0c;毕业批次模块通过其精心设计的毕业批次功能&#xff0c;为即将离校的学子们提供了一个高效、便捷的过渡平台。这一特色功能聚焦于特定时间段内的毕业生群体&#xff0c;巧妙融合数字技术&#xff0c;从信息核实到最终的离校程序&#xf…

代码随想录二刷7.22|977.有序数组的平方

暴力解法&#xff1a; ——如果想暴力解决这个问题的话&#xff0c;可以像题目那样&#xff0c;先将每一个元素平方&#xff0c;然后再排序 双指针&#xff1a; ——从题目中找到的信息&#xff1a;这是一个非递减顺序的整数数组&#xff0c;从例子中&#xff0c;可以容易看…

西邮计科嵌入式复习

西邮嵌入式复习 一、第一章复习二、第二章复习三、第三章复习四、第四章复习 一、第一章复习 二、第二章复习 三、第三章复习 四、第四章复习

内网服务器通过squid代理访问外网

一、背景 现在要对172.16.58.158服务器进行openssh升级操作,我用之前写好的升级脚本执行后,发现没有备份旧的ssh程序文件,然后还卸载了oenssl-devel,然后我发现其他服务器ssh该服务器失败。同时脚本执行时报错“ configure: error: *** zlib.h missing - please install first …

无人驾驶大热,新能源汽车智能化中的算网支持

来源新华社&#xff1a;百度“萝卜快跑”全无人驾驶汽车行驶在路上 当前&#xff0c;新能源汽车产业数智化已成为全球汽车产业数字化转型的焦点。一方面&#xff0c;随着人工智能、大数据、云计算等技术的深度融合&#xff0c;新能源汽车在自动驾驶、智能互联、能源管理等方面…

xmind梳理测试点,根据这些测试点去写测试用例

基本流&#xff08;冒烟用例必写&#xff09; 备选流 公共测试点&#xff1a;

【题解】42. 接雨水(动态规划 预处理)

https://leetcode.cn/problems/trapping-rain-water/description/ class Solution { public:int trap(vector<int>& height) {int n height.size();// 预处理数组vector<int> lefts(n, 0);vector<int> rights(n, 0);// 预处理记录左侧最大值lefts[0] …