每日面试题2道、算法两道

news/2024/4/29 6:20:14/文章来源:https://blog.csdn.net/weixin_52574640/article/details/127246093

目录

一、 面试题

i++、++i的自增问题

写一个Singleton实例

二、数组  算法

寻找数组的中心索引

搜索插入位置


一、 面试题

i++、++i的自增问题

/*** @packageName: com.sofwin.mianshi* @user: wentao* @date: 2022/10/10 14:31* @email 1660420659@qq.com* @description: i++、++i的 面试问题*/
public class IAdd {public static void main(String[]args){int i=1;i=i++;int j=i++;int k=i+ ++i*i++;System.out.println("i:"+i);System.out.println("j:"+j);System.out.println("k:"+k);}
}
这个程序的输出结果是什么

为什么这这样的呢;

首先我们要明白以下几点:

  • 赋值=,最后运算

  • =右面的从左到右依次压入数栈

  • 实际先算那个,按照运算法的优先级

  • 自增、自减操作都是直接修改变量的值,不经过操作数栈

  • 最后的赋值之前,临时结果也存储在操作数栈中

画图分析

i=i++

j=i++

k =i+ ++i* i++

写一个Singleton实例

首先什么是Singleton?

  • Singleton:在java中是指单例设计模式,它是软件开发中最常用的设计模式之一

  • 单例设计模式:即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式

要点

  • 某个类只能有一个实例;

    构造器私有化即可

  • 它必须自行创建这个实例

    该有一个该类的静态变量来保存这个唯一的实例

  • 它必须自行向整个系统提供这个实例

    直接使用public暴露 或者 封装使用get方法进行暴露

几种常见的形式

  • 饿汉式:直接创建对象,不存在线程安全问题

    • 直接实例化饿汉式(简介直观)

      /*** @packageName: com.sofwin.mianshi* @user: wentao* @date: 2022/10/10 14:58* @email 1660420659@qq.com* @description: 饿汉式:直接实例化  ,在类初始化时,不管是否需要这个对象* (1)构造器私有化* (2)自行创建,并且使用静态变量保存* (3)向外体用这个实例    为了强调这是一个单例,用final进行修饰*/
      public class Singleton1 {public  static  final  Singleton1 INSTANCE =new Singleton1();//构造器私有化private   Singleton1(){}
      }

    • 枚举式(最简洁)

      /*** @packageName: com.sofwin.mianshi* @user: wentao* @date: 2022/10/10 15:03* @email 1660420659@qq.com* @description: 饿汉式: 使用枚举 :表示该类型的对象是有限的几个*/
      public enum Singleton2 {INSTANCE
      }

    • 静态代码块饿汉式(适合复杂实例化)

      singleton.properties

      info=zhangsan

      /*** @packageName: com.sofwin.mianshi* @user: wentao* @date: 2022/10/10 15:06* @email 1660420659@qq.com* @description: 饿汉式 :静态代码块  适合复杂的类型*/
      public class Singleton3 {
      ​private  String info;public  static  final Singleton3 INSTANCE;static {try{Properties pro=new Properties();InputStream in=Singleton3.class.getClassLoader().getResourceAsStream("singleton.properties");pro.load(in);INSTANCE=new Singleton3(pro.getProperty("info"));}catch (Exception ex){throw  new RuntimeException(ex);}
      ​}
      ​private  Singleton3(String info){this.info=info;}
      ​public String getInfo() {return info;}
      ​@Overridepublic String toString() {return "Singleton3{" +"info='" + info + '\'' +'}';}
      }

  • 懒汉式:延迟创建对象

    • 线程不安全(适合单线程)

      /*** @packageName: com.sofwin.mianshi* @user: wentao* @date: 2022/10/10 15:19* @email 1660420659@qq.com* @description: 懒汉式* (1)构造器私有化* (2)在类中用一个静态变量保存这个唯一的实例* (3)提供一个静态方法来获取这个对象*/
      public class Singleton4 {private static   Singleton4 instance;
      ​private Singleton4(){
      ​}public  static  Singleton4 getInstance(){if (instance==null){instance=new Singleton4();}return  instance;}
      }

      但是当多线程的时候 上面的代码就会出错

      可能出现当第一个线程进入if判断还没有创建的时候, 第二次线程也正好进入了这就造成了非单例的情况

      测试如下:

      public class TestSingleton4 {public static void main(String[]args) throws ExecutionException, InterruptedException {
      //        Singleton4 instance = Singleton4.getInstance();
      //        Singleton4 instance2 = Singleton4.getInstance();
      //        System.out.println(instance==instance2);Callable<Singleton4> c=new Callable<Singleton4>() {@Overridepublic Singleton4 call() throws Exception {return Singleton4.getInstance();}};//创建两个线程的线程池ExecutorService ex =Executors.newFixedThreadPool(2);Future<Singleton4> f1 = ex.submit(c);Future<Singleton4> f2 = ex.submit(c);Singleton4 s1 = f1.get();Singleton4 s2 = f2.get();System.out.println(s1);System.out.println(s2);System.out.println(s1==s2);ex.shutdown();}
      }

    • 线程安全(使用多线程)

      package com.sofwin.mianshi;
      ​
      /*** @packageName: com.sofwin.mianshi* @user: wentao* @date: 2022/10/10 15:19* @email 1660420659@qq.com* @description: 懒汉式* (1)构造器私有化* (2)在类中用一个静态变量保存这个唯一的实例* (3)提供一个静态方法来获取这个对象*/
      public class Singleton5 {private static Singleton5 instance;
      ​private Singleton5(){
      ​}
      ​public  static Singleton5 getInstance(){synchronized (Singleton5.class){if (instance==null){instance=new Singleton5();}}
      ​return  instance;}
      }
      ​

    • 静态内部类的形式(适用于多线程)

      package com.sofwin.mianshi;
      ​
      import java.io.InputStream;
      import java.sql.Statement;
      ​
      /*** @packageName: com.sofwin.mianshi* @user: wentao* @date: 2022/10/10 15:40* @email 1660420659@qq.com* @description: 懒汉式:在内部类被加载和初始化的时候才会创建*    静态内部类不会随着外部类的加载和初始化*    它是要单独去加载和初始化的 ,并且是线程安全的,因为是在内部类加载和初始化时*/
      public class Singleton6 {
      ​private  Singleton6(){
      ​}
      ​private static  class  Inner{private static  final Singleton6 INSTANCE=new Singleton6();}public  static  Singleton6 getInstance(){return Inner.INSTANCE;}
      }
      ​

二、数组  算法

寻找数组的中心索引

给你一个下标从 0 开始的整数数组 nums ,请你找到 最左边 的中间位置 middleIndex (也就是所有可能中间位置下标最小的一个)。

中间位置 middleIndex 是满足 nums[0] + nums[1] + ... + nums[middleIndex-1] == nums[middleIndex+1] + nums[middleIndex+2] + ... + nums[nums.length-1] 的数组下标。

如果 middleIndex == 0 ,左边部分的和定义为 0 。类似的,如果 middleIndex == nums.length - 1 ,右边部分的和定义为 0 。

请你返回满足上述条件 最左边 的 middleIndex ,如果不存在这样的中间位置,请你返回 -1 。

示例 1:
​
输入:nums = [2,3,-1,8,4]
输出:3
解释:
下标 3 之前的数字和为:2 + 3 + -1 = 4
下标 3 之后的数字和为:4 = 4
​
示例 2:
​
输入:nums = [1,-1,4]
输出:2
解释:
下标 2 之前的数字和为:1 + -1 = 0
下标 2 之后的数字和为:0
示例 3:
​
输入:nums = [2,5]
输出:-1
解释:
不存在符合要求的 middleIndex 。
示例 4:
​
输入:nums = [1]
输出:0
解释:
下标 0 之前的数字和为:0
下标 0 之后的数字和为:0

来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的题解

class Solution {public int findMiddleIndex(int[] nums) {int a=0;int b=0;for(int i=0;i<nums.length;i++){//先得到全部值b+=nums[i];}for(int i=0;i<nums.length;i++){a+=nums[i];if(a==b){return i;}b-=nums[i];}return -1;}
}
时间复杂度 O(n)

总结

跟官方差不多
官方的是  
for (int i = 0; i < nums.length; ++i) {if (2 * sum + nums[i] == total) {return i;}sum += nums[i];}
​
既然要求左面等于右面   我们直接用二倍的sum加上 nums[i] 如果等于total就返回i  都不成立就返回-1
但是还是2倍的执行效率比较快,因为只是执行了一次的累加

搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:
​
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
​
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
​
输入: nums = [1,3,5,6], target = 7
输出: 4

作者:力扣 (LeetCode) 链接:力扣 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我的题解

class Solution {public int searchInsert(int[] nums, int target) {for(int i=0;i<nums.length;i++){if(target<=nums[i]) return i;}return nums.length;}
}
不足:当数组过大的时候,会出现很大差别;这个时候就可以考虑使用二分查找了class Solution {public int searchInsert(int[] nums, int target) {int left=0;int right=nums.length-1;int  mid=0;//防止溢出   要将等于加上--否则回漏下条件while(left<=right){mid=(left+right)/2;if(nums[mid]==target){return mid;}if(nums[mid]<target){left=mid+1;}if(nums[mid]>target){right=mid-1;}}return left;}
}    

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

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

相关文章

(附源码)计算机毕业设计SSM志愿者活动管理平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

pytorch:本地使用tensorboard可视化

摘要&#xff1a; tensorboard是tensorflow用来可视化训练和测试过程的模块&#xff0c;而pytorch并没有可视化模块&#xff0c;但是pytoch1.2.0版本以上开始支持tensorboard。 目录一、 安装tensorboard二、 使用tensorboard1、首先导入模块&#xff1a;2、初始化&#xff1a;…

深度神经网络怎么用

深度学习 对硬件的要求 之前热衷于学习理论知识&#xff0c;目前想跑代码了发现不知道从何下手&#xff0c;自己电脑上搭建的平台基本就是个摆设&#xff0c;因为跑不起来呀。今天我们就来看看想做深度学习应该怎么下手。 首先了解下基础知识&#xff1a;1、深度学习用cpu训练…

2.Jenkins项目创建

Jenkins项目创建1.新建项目 2.创建一个freestyle的项目 3.填写描述信息 4.可以选择丢弃旧的构建 每次构建都会产生一个任务&#xff0c;这个任务想保留多少天&#xff0c;可以设置保留构建的天数 保留最大的个数&#xff1a;例如设置为10个&#xff0c;当任务达到了10个之…

Spring Rest Docs使用

今天给大家分享一个能通过代码自动生成文档技术&#xff0c;Spring Rest Doc过在单元测试中额外添加 API 信息描述&#xff0c;从而自动生成对应的文档片段。 下面通过一个简单的例子演示下如何快速上手的。在Spring Boot项目中添加maven 依赖 <dependency><groupId&g…

Android 使用Jenkins 自动化多渠道打包并且分发到蒲公英、下发到钉钉通知【即拿即用】

前言 一、tomcat 安装启动 二、jenkins war 包下载并安装 三、jenkins 配置教程 四、jenkins items 工程配置 五、android gradle 脚本编码 六、分发到蒲公英脚本编码以及七、通知钉钉逻辑编码 前言 Android 在每个版本测试阶段&#xff0c;通常会因为修复BUG 去验证&#x…

理解vue中的.sync和.$emit

首先来说一下 .sync 修饰符的作用 第一步&#xff1a;先用一句话解释 .sync修饰符可以实现子组件与父组件的双向绑定&#xff0c;并且可以实现子组件同步修改父组件的值。 第二步&#xff1a;具体解释 一般情况下&#xff0c;想要实现父子组件间值的传递&#xff0c;通常使用…

英文论文要怎么查重?

英文论文查重和中文查重一样&#xff0c;只是在渠道选择方面会有些许差别。今天就具体聊聊英文论文怎么查重&#xff0c;并向大家推荐几个比较常用的英文论文查重工具。 英文论文怎么查重&#xff1a; 1、论文为什么要查重 2、论文查重的原理 3、英文论文怎么查重 4、选择…

柳州楼顶种植水稻 国稻种芯·中国水稻节:广西12万亩米飘香

柳州楼顶种植水稻 国稻种芯中国水稻节&#xff1a;广西12万亩米飘香 广西新闻网-南国今报柳江讯&#xff08;记者钟华 通讯员梁睿&#xff09;新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农…

RabbitMQ常用消息模式

目录 1、RabitMQ工作队列 2、交换机 3、RabbitMQ Fanout 发布订阅--- Fanout exchange(扇型交换机) 3.1、创建连接代码 3.1、生产者代码 3.2、消费者代码 4、Direct路由模式 4.1、生产者代码 4.2、消费者代码 5、Topic主题模式 5.1、生产者代码 5.2、消费者代码 1、…

分享两套企业级进销存管理系统源码

▶▶▶▶1&#xff1a;SpringBoot企业级进销存ERP管理系统源码 00189 本系统采用企业级开发标准&#xff0c;使用SpringBoot架构&#xff0c;数据访问层采用Spring Data Jpa&#xff0c;业务控制层采用SpringMvc&#xff0c;安全框架采用Shiro&#xff0c;实现了完整权限系…

风控模型别只会KS、AUC了,来看看其他衡量模型好坏的一些重要指标吧|含实操

当我们训练好一个机器学习模型之后&#xff0c;必然会对模型的综合性能进行评估&#xff0c;针对分类、回归、聚类等不同类型的算法模型&#xff0c;可以采用相关的评价指标&#xff0c;例如分类模型的Accuracy、KS等&#xff1b;回归模型的MAE、MSE等&#xff1b;聚类模型的SS…

Linux下编写C使用的GDB调试器

目录 1.GDB调试器 2.GDB使用 3.实例程序调试 &#xff08;1&#xff09;编写一段C程序 &#xff08;2&#xff09;对C程序进行编译 &#xff08;3&#xff09;调试阶段 ①启动调试 ②查看文件 ③设置断点 ④查看断点情况 ⑤运行代码 ⑥单步运行 ⑦恢复程序 ⑧查看…

数字孪生建筑工程系统开发案例方案,如何选择数孪平台?

据统计&#xff0c;全国建筑业增长值在 GDP 增长中所占比重连续十年保持在 6. 85%以上&#xff0c;其支柱产业的地位依然保持。但是我国建筑业产值利润率已连续五年下滑&#xff0c;部分原因是其生产方式粗放、信息化水平不高、科技创新能力不足等。因此&#xff0c;在发展数字…

java类加载机制解析

一&#xff1a;类加载流程 public class Math {public static final int initData 666;public static User user new User();public int compute(){int a 1;int b 2;return ab;};public static void main(String[] args){Math math new Math();math.compute();} } 当我们…

Mybatis批量插入数据

前言 在很多业务场景中&#xff0c;我们需要批量录入数据。那么意味着我们需要以最高效的方式去实现功能&#xff0c;同时也需要保证软件的便捷性与可维护性&#xff0c;开源字节使用MyBatis foreach标签方式优雅的实现了材料的出入库。源码开放&#xff0c;可前往码云仓库免费…

NR 物理层编码 - slide7 卷积码

前言&#xff1a; 卷积码(n,k,N) 是一种非分组码.与线性分组码的区别: 是一种有记忆的编码方案,n个输出不仅与当前k个输入有关系,也与移位寄存器前N个输入有关系. 发展历史&#xff1a; 1955年 麻省理工的P.Elias 发明 1957年 序列译码法 1963年 门限译码法 1967年 Vi…

MongoDB分片机制

为什么需要分片 应用层实现的手动分片&#xff1a; MongoDB分片组件 mongos路由器负责将应用程序的请求指引到合适的分片上。注意到mongos路由器是在应用程序端实现的&#xff0c;因此分片的配置信息需要保存在另外的服务器上&#xff0c;即配置服务器。mongos通过两阶段提交同…

使用PreparedStatement对数据库的增删改查

目录 介绍 JDBCUtils自定义工具类 增 删 改 查 介绍 可以通过调用 Connection 对象的 preparedStatement() 方法获取PreparedStatement 对象PreparedStatement 接口是 Statement 的子接口&#xff0c;它表示一条预编译过的 SQL 语句PreparedStatement 对象所代表的 SQL 语…

拼搏半个月,刷了 571道Java高频面试题喜提阿里 offer,定级 P7

今年较往年相比面试要难的多&#xff0c;大环境也是对于程序员的要求越来越高&#xff0c;环境是我们无法改变的&#xff0c;我们能改变的只有自己&#xff0c;月初我一好友&#xff0c;努力拼搏一周&#xff0c;刷完了这份阿里 P8 大牛整理的这 571 道 Java 高频面试题笔记&am…