java面试中常见的数组题目汇总(三)

java面试中常见的数组题目汇总(三)

星级:*****

1、顺时针打印矩阵

(学习视频分享:java课程)

【题目】

白瓜面试 白瓜面试

白瓜面试 – AI面试助手,辅助笔试面试神器

白瓜面试 40 查看详情 白瓜面试

立即学习“Java免费学习笔记(深入)”;

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

【代码】

public ArrayList printMatrix(int [][] matrix) {        int width,height,x,y,count,n;        height = matrix.length;        width = matrix[0].length;        // 遍历游标        x = 0;        y = 0;        count = 0;        // 元素个数        n = height * width;        boolean[][] flag = new boolean[height][width];        ArrayList list = new ArrayList();        while (count < n) {            // x不变,y增加            while (y<width && !flag[x][y]) {                list.add(matrix[x][y]);                flag[x][y] = true;                count ++;                y ++;            }            y--;            x++;            // x增加,y不变            while (x=0 && !flag[x][y]) {                list.add(matrix[x][y]);                flag[x][y] = true;                count ++;                y--;            }            y++;            x--;            // x变少,y不变            while (x>=0 && !flag[x][y]) {                list.add(matrix[x][y]);                flag[x][y] = true;                count ++;                x--;            }            x++;            y++;        }        return list;    }

【思考】

需要注意边界是否越界以及,游标(x,y)经过x++或者y++之后,定位在什么地方,需要进行手动的转弯。

2、数组中出现次数超过一半的数字

【题目】

立即学习“Java免费学习笔记(深入)”;

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为 9 的数组 {1,2,3,2,2,2,5,4,2}。由于数字 2 在数组中出现了 5 次,超过数组长度的一半,因此输出 2。如果不存在则输出 0。

【代码】

package swear2offer.array;import java.util.Arrays;public class Half {    /**     * 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。     * 例如输入一个长度为 9 的数组 {1,2,3,2,2,2,5,4,2}。     * 由于数字 2 在数组中出现了 5 次,超过数组长度的一半,因此输出 2。如果不存在则输出 0。     * */    public int MoreThanHalfNum_Solution(int [] array) {        int n,count,i,k;        n = array.length;        if (n == 0) return 0;        if (n == 1) return array[0];        // 标记数组        int[] flag = new int[n];        // 给数组排序        Arrays.sort(array);        count = 1;        flag[0] = 1;        for (i=1; i<n; i++) {            // 因为是排序好的,如果存在相等的            if (array[i-1] == array[i]) {                count ++;            } else {                count = 1;            }            flag[i] = count;        }        count = 0;        k = 0;        for (i=1; i<n; i++) {            if (count  n/2 ? array[k] : 0;    }}

(相关面试题推荐:java面试题及答案)

【代码2】

不需要的排序的巧妙方法:

用 preValue 记录上一次访问的值,count 表明当前值出现的次数,如果下一个值和当前值相同那么 count++;如果不同 count–,减到 0 的时候就要更换新的 preValue 值了,因为如果存在超过数组长度一半的值,那么最后 preValue 一定会是该值。

public int MoreThanHalfNum_Solution(int [] array) {        if(array == null || array.length == 0)return 0;        int preValue = array[0];//用来记录上一次的记录        int count = 1;//preValue出现的次数(相减之后)        for(int i = 1; i < array.length; i++){            if(array[i] == preValue)                count++;            else{                count--;                if(count == 0){                    preValue = array[i];                    count = 1;                }            }        }        int num = 0;//需要判断是否真的是大于1半数        for(int i=0; i  array.length/2)?preValue:0;     }

【思考】

当i从1而不是0开始的时候,通常需要特殊考虑只有一个元素的情况

3、连续子数组的最大和

【题目】

立即学习“Java免费学习笔记(深入)”;

给一个数组,返回它的最大连续子序列的和,例如:{6,-3,-2,7,-15,1,2,2}, 连续子向量的最大和为 8 (从第 0 个开始,到第 3 个为止)

【代码】

/**     * 给一个数组,返回它的最大连续子序列的和     *     * 例如:{6,-3,-2,7,-15,1,2,2}, 连续子向量的最大和为 8 (从第 0 个开始,到第 3 个为止)     *     * 非常典型的dp     *     * 动规通常分为顺推和逆推两个不同的方向     * 要素:边界,状态转移公式,数组代表含义     * array[]     * dp[x],从各个正数开始连续到达x时,最大和,即连续子序列的最大和     * 需要注意:1.从第一个正数开始,2.是连续序列     * 通常情况下,连续序列的复杂度为O(n),非连续序列为O(n*n)     * */    public int FindGreatestSumOfSubArray(int[] array) {        int n,i,len,res;        int[] dp;        n = array.length;        if (n == 0 || array == null) return 0;        if (n == 1) return array[0];        dp = new int[n];        dp[0] = array[0];        len = 0;        res = array[0];        for (i=1; i<n; i++) {            len = dp[i-1] + array[i];            if (dp[i-1] < 0) {                dp[i] = array[i];            } else {                dp[i] = len;            }            if (res < dp[i]) res = dp[i];        }        return res;    }

【思路】

从前往后遍历,最大的连续子序列的和是由当前元素和之前的最大连续子序列的和叠加在一起形成的。如果之前的最大连续子序列的和大于零,我们可以继续累加,如果小于零,则需要舍去之前的子序列,重新从当前的数字开始累加。时间复杂度为 O (n)

4、整数中 1 出现的次数

【题目】

立即学习“Java免费学习笔记(深入)”;

求出 1~13 的整数中 1 出现的次数,并算出 100~1300 的整数中 1 出现的次数?为此他特别数了一下 1~13 中包含 1 的数字有 1、10、11、12、13 因此共出现 6 次,但是对于后面问题他就没辙了。ACMer 希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中 1 出现的次数(从 1 到 n 中 1 出现的次数)。

【代码】

public int NumberOf1Between1AndN_Solution(int n) {        if (n == 1) return 1;        int nCount,i,j;        nCount = 0;        for (i=1; i 0) {                if (j%10 == 1) nCount++;                j = j/10;            }        }        return nCount;    }

【思考】

不要用递归写,最简单的循环即可

5、丑数

【题目】

立即学习“Java免费学习笔记(深入)”;

把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含质因子 7。 习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。

【代码】

/**     * 把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。     * 例如 6、8 都是丑数,但 14 不是,因为它包含质因子 7。     * 习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。     *     * 从已有的丑数中选取一个,分别*2,*3,*5,再取最小的     * 最小的索引++,并赋值     * */    public int GetUglyNumber_Solution(int index) {        if (index == 0) return 0;        int p2,p3,p5,i,temp;        p2 = p3 = p5 = 0;        int[] res = new int[index];        res[0] = 1;        for (i=1; i<index; i++) {            res[i] = Math.min(res[p2]*2,Math.min(res[p3]*3,res[p5]*5));            if (res[i] == res[p2]*2) p2++;            if (res[i] == res[p3]*3) p3++;            if (res[i] == res[p5]*5) p5++;        }        return res[index-1];    }

【思考】

当特定某些性质的数列排序时,可以考虑这种方法。

相关推荐:java入门

以上就是java面试中常见的数组题目汇总(三)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/569865.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何使用入侵防御系统(IPS)保护CentOS服务器免受攻击
上一篇 2025年11月10日 05:32:17
IOS 17.4.1建议更新吗?
下一篇 2025年11月10日 05:32:20

相关推荐

  • VSCode怎么用NodeJS联想_VSCode配置Node.js智能提示与自动补全功能教程

    VSCode在Node.js项目中实现智能提示的核心是通过jsconfig.json或tsconfig.json配置文件,结合@types类型定义和语言服务解析代码结构。正确设置module、target、baseUrl、paths等选项,并安装对应@types包,可显著提升代码联想准确性;对于无类…

    2026年8月27日
    100
  • 避免命令行输出被其他线程打印信息中断

    本文旨在解决多线程环境下,命令行交互过程中,其他线程的输出信息干扰用户输入的问题。文章将阐述为何无法完全阻止此类中断,并提供几种可行的解决方案,包括重定向输出、使用命名管道以及利用 curses 库进行多线程控制台程序设计。 在多线程 Java 程序中,当一个线程(例如主线程)通过 Scanner.…

    2026年8月27日
    000
  • 使用Yii作为微服务架构的后端

    使用yii框架可以有效地构建微服务架构的后端。1) yii的restful api支持强大,适合定义和管理api端点。2) 依赖注入容器便于管理服务间依赖。3) 模块化设计有助于功能拆分和重组。4) 性能优化和最佳实践,如缓存和日志系统,提升服务性能和可靠性。 你想知道如何使用Yii框架来构建微服务…

    2026年8月27日
    000
  • 使用JAXB解析带命名空间的XML请求到Java对象

    本文旨在帮助开发者解决在使用JAXB(Java Architecture for XML Binding)将包含命名空间的XML请求解析为Java对象时遇到的`UnmarshalException`异常。通过修改`@XmlRootElement`注解,明确指定命名空间,可以有效解决由于命名空间不匹配…

    2026年8月26日
    000
  • Java中组合优于继承的设计理念

    组合优于继承是Java设计原则,主张通过对象组合实现代码复用,而非继承。它降低耦合、提升灵活性与可维护性。继承导致紧耦合、破坏封装、单继承限制等问题,而组合通过接口依赖、运行时行为切换、多行为集成等优势弥补这些缺陷。实践中应定义行为接口,在类中持有接口引用并注入具体实现。该原则提倡慎用继承,仅在明确…

    2026年8月26日
    000
  • 如何利用Java使用ConcurrentHashMap处理并发

    ConcurrentHashMap因分段锁和CAS机制提升并发性能,支持原子操作如putIfAbsent、compute、merge,遍历时提供弱一致性视图,适用于高并发场景。 在多线程环境中,ConcurrentHashMap 是 Java 提供的一个高效且线程安全的 Map 实现。它比传统的 H…

    2026年8月26日
    000
  • java中文乱码在线转换 在线工具解决编码问题

    java中文乱码可以通过在线工具解决。1) 使用编码转换工具如convertio,将文件从一种编码转换为另一种。2) 使用编码检测工具如fileformat.info,识别未知编码的文件。3) 统一编码标准,使用版本控制和定期检查,确保编码一致性。 提到Java中文乱码在线转换和解决编码问题,我们首…

    2026年8月26日
    100
  • 什么是java Java编程语言全面介绍

    java是一个强大的编程语言,适用于从小型应用到大型企业级系统的开发。其核心特点包括:一次编写,到处运行:通过jvm实现跨平台运行。面向对象编程:支持类、对象、继承和多态,增强代码组织和灵活性。集合框架:提供如arraylist等工具,简化数据处理。丰富的生态系统:包括异常处理、多线程、lambda…

    2026年8月26日
    000
  • java中的实例是什么意思 实例与对象的概念辨析

    在java中,”实例”是某个类的具体实现,而”对象”是任何可以操作的实体。1.实例是通过new关键字创建的,如string s = new string(“hello”)中的s。2.对象包括所有实例和基本数据类型,如int sp…

    2026年8月26日
    100
  • 微信公众号小程序怎么做_微信公众号关联小程序开发教程

    微信公众号小程序怎么做_微信公众号关联小程序开发教程微信公众号小程序怎么做_微信公众号关联小程序开发教程微信公众号小程序怎么做_微信公众号关联小程序开发教程微信公众号小程序怎么做_微信公众号关联小程序开发教程

    先完成小程序开发与审核,再通过公众号后台授权绑定。需先注册开发者账号并认证公众号,创建小程序项目后使用微信开发者工具进行开发,提交审核通过后,在公众号后台关联小程序AppID,实现多入口展示与运营联动。 微信公众号关联小程序,核心在于先独立完成小程序的开发与审核,然后通过公众号后台进行简单的授权绑定…

    2026年8月26日 用户投稿
    100
  • 从 ArrayList 中基于数量移除重复项的实用指南

    本文旨在提供一种从 `ArrayList` 中根据数量移除重复项的有效方法。针对包含具有数量属性的对象的 `ArrayList`,当需要根据用户输入的数量移除特定名称的项时,我们将介绍如何处理列表中同名项数量合并的问题。通过提供的代码示例,你将学会如何安全且高效地从列表中移除指定数量的重复项。 在处…

    2026年8月26日
    000
  • Java中线程组的概念 解析管理线程集合的方式

    Java中线程组的概念 解析管理线程集合的方式Java中线程组的概念 解析管理线程集合的方式Java中线程组的概念 解析管理线程集合的方式Java中线程组的概念 解析管理线程集合的方式

    不建议过度使用线程组的原因主要有两点:一是其层级结构固定,难以适应复杂并发场景;二是存在安全漏洞风险。1.executorservice提供了更灵活的线程池配置和管理方式,支持任务提交、取消和监控等功能。2.使用executorservice时,可通过executors.newfixedthread…

    2026年8月26日 用户投稿
    100
  • Java中FTP怎么操作 详解FTP客户端实现

    Java中FTP怎么操作 详解FTP客户端实现Java中FTP怎么操作 详解FTP客户端实现Java中FTP怎么操作 详解FTP客户端实现Java中FTP怎么操作 详解FTP客户端实现

    java中操作ftp的解决方案是使用apache commons net库。1.首先在maven或gradle项目中引入commons-net依赖;2.通过ftpclient类实现连接、上传、下载和删除文件等操作;3.建立连接时需指定服务器地址、端口、用户名和密码,并设置二进制传输模式及被动模式;4…

    2026年8月26日 用户投稿
    000
  • 如何让你的Magento2商店说法语?使用Composer轻松部署多语言包

    可以通过一下地址学习composer:学习地址 我最近在负责一个magento 2电商平台,老板雄心勃勃地想拓展法国市场。然而,摆在我面前的第一个难题就是:如何让我的英文商店“说”法语?如果用户访问网站时看到的是熟悉的母语界面,无疑会大大提升他们的购物体验,增加转化率。 最初,我考虑过手动下载法语语…

    用户投稿 2026年8月26日
    000
  • 使用 jpackage 和 WiX 4 的兼容性挑战及解决方案

    本文探讨了在使用 java 19 和 wix 4 时,`jpackage` 工具在 windows 平台下生成安装包时遇到的兼容性问题。尽管 `jpackage` 文档声称支持 wix 3.0 或更高版本,但它未能识别 wix 4。文章提供了一个无需安装完整 wix 3 或处理 .net 3.5.1…

    2026年8月26日
    000
  • Java中LocalDate怎么使用 掌握Java 8日期类的常用方法

    Java中LocalDate怎么使用 掌握Java 8日期类的常用方法Java中LocalDate怎么使用 掌握Java 8日期类的常用方法Java中LocalDate怎么使用 掌握Java 8日期类的常用方法Java中LocalDate怎么使用 掌握Java 8日期类的常用方法

    localdate的创建方式主要有三种:1. 使用localdate.now()获取当前日期;2. 使用localdate.of(int year, int month, int dayofmonth)指定年月日;3. 使用localdate.parse(charsequence text)从字符串…

    2026年8月26日 用户投稿
    100
  • Java中线程状态有哪些 图解线程生命周期的六种状态

    Java中线程状态有哪些 图解线程生命周期的六种状态Java中线程状态有哪些 图解线程生命周期的六种状态Java中线程状态有哪些 图解线程生命周期的六种状态Java中线程状态有哪些 图解线程生命周期的六种状态

    java线程生命周期包含六种状态,分别是new、runnable、blocked、waiting、timed_waiting和terminated。1. new表示线程被创建但尚未启动;2. runnable表示线程已就绪或正在运行;3. blocked表示线程因等待锁而阻塞;4. waiting表…

    2026年8月26日 用户投稿
    000
  • Java中Faker的作用 解析虚拟数据

    Java中Faker的作用 解析虚拟数据Java中Faker的作用 解析虚拟数据Java中Faker的作用 解析虚拟数据Java中Faker的作用 解析虚拟数据

    faker在java中用于生成虚拟数据。它能模拟个人信息、公司信息、银行信息、互联网信息等多种类型数据,如姓名、地址、电话、邮箱等,并支持自定义规则。使用时需在项目中添加对应maven或gradle依赖,其优势包括简化测试准备、生成逼真数据、支持多语言,但存在随机性高、数据质量不稳定、性能影响等局限…

    2026年8月26日 用户投稿
    000
  • Java中如何实现动画 详解定时刷新机制

    Java中如何实现动画 详解定时刷新机制Java中如何实现动画 详解定时刷新机制Java中如何实现动画 详解定时刷新机制Java中如何实现动画 详解定时刷新机制

    java中实现动画的核心机制是定时刷新画面,利用javax.swing.timer在gui程序中安全更新界面。具体步骤为:选择jpanel等组件重写paintcomponent()绘制帧内容;创建timer设置延迟时间和actionlistener;在actionperformed()中更新动画状态…

    2026年8月26日 用户投稿
    100
  • safari浏览器“网页进程意外终止”是什么问题_safari浏览器网页进程意外终止原因

    网页进程意外终止通常由缓存损坏、系统过时、插件冲突、网络异常或实验性功能导致。1、清除Safari历史记录与网站数据;2、更新iOS至最新版本;3、禁用第三方内容拦截器;4、还原网络设置;5、关闭实验性功能与桌面模式,恢复默认配置以解决问题。 如果您在使用 Safari 浏览器时,遇到页面突然关闭或…

    2026年8月26日
    000

发表回复

登录后才能评论
关注微信