Javase-8.数组的练习

1.查找数组中指定元素(二分查找)

以升序数组为例, 二分查找的思路是先取中间位置的元素, 然后使用待查找元素与数组中间元素进行比较:
如果相等,即找到了返回该元素在数组中的下标
如果小于,以类似方式到数组左半侧查找
如果大于,以类似方式到数组右半侧查找
public static void main(String[] args) {int[] array = {2,4,1,23,65,34,89,76,32};Arrays.sort(array);//排完升序:1,2,4,23,32,34,65,76,89
//Arrays.sort();这个工具可以顺序打乱的数组排成正序System.out.println(binarySearch(array, 89));
}public static int binarySearch(int[] array,int key) {int left = 0;int right = array.length - 1;int mid = array.length / 2;while(left <= right) {if(key > array[mid]) {left = mid + 1;mid = (left + right) / 2;}else if(key < array[mid]) {right = mid - 1;mid = (left + right) / 2;}else{return mid;}}return -1;
}

2.数组排序(冒泡排序)

算法思路
假设排升序:
1. 将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾
2. 依次进行上述过程,直到数组中所有的元素都排列好
public static void main(String[] args) {int[] array = {3,5,1,30,10};bubble(array);System.out.println(Arrays.toString(array));
}public static void bubble(int[] array) {for (int i = 0; i < array.length; i++) {for (int j = 0; j < array.length-1; j++) {if(array[j] > array[j+1]) {int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;}}}
}

上述代码已能成功实现数组的排序,但仍能进一步优化,如下图,可以发现当i = 1时,j只需从j = 0比较到j = 2(array.length - 1 - i),因为在 i = 0的排完序之后, 最后一个元素已经有序了, 无需再进行比较排序. 下图所示过程不完整,可以自行补充完整,到时就一目了然了。 如下图, 当 i = 1时, i = 1这一趟排完序之后发现 所有元素已经排好升序了, 那也就是说在冒泡排序过程中, 存在一种可能,就是某一趟排序就已经把所有元素排好了无需再进行后续的排序, 我们其实可以定义一个 flg 来标记这种情况,可能某一趟就把顺序排好直接跳出循环,提高效率.

于是有了如下优化过的代码:

public static void bubble(int[] array) {for (int i = 0; i < array.length; i++) {boolean flg = false;//排序前将flg赋值为falsefor (int j = 0; j < array.length-1-i; j++) {if(array[j] > array[j+1]) {int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;flg = true;//有发生交换就给flg赋为true,说明顺序还没排好}}if(flg == false) {break;}}
}

3.数组逆序

给定一个数组, 将里面的元素逆序排列.
思路:
设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素.
然后让前一个下标自增, 后一个下标自减, 循环继续即可.
代码示例
public static void main(String[] args) {int[] array = {1,2,3,4,5};reverse(array);System.out.println(Arrays.toString(array));
}public static void reverse(int[] array) {int left = 0;int right = array.length - 1;while(left < right) {int tmp = array[left];array[left] = array[right];array[right] = tmp;left++;right--;}
}

4.奇数位于偶数之前

调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。

如数组:[1,2,3,4,5,6]

调整后可能是:[1, 5, 3, 4, 2, 6]

本题可以使用2个下标,一个从0下标开始,一个从最后一个下标开始。

public static void main(String[] args) {int[] array = {1,2,3,4,5};func(array);System.out.println(Arrays.toString(array));
}public static void func(int[] array) {int i = 0;int j = array.length-1;while(i < j) {while(i < j && array[i] % 2 != 0) {i++;}while(i < j && array[j] % 2 != 1) {j--;}int tmp = array[i];array[i] = array[j];array[j] = tmp;}
}

5.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

public static void main(String[] args) {int[] array = {2,7,11,15};int[] array1 = func(array,9);System.out.println(Arrays.toString(array1));
}public static int[] func(int[] array,int key) {for (int i = 0; i < array.length-1; i++) {for (int j = i+1; j <array.length; j++) {if(array[i] + array[j] == key) {int[] arr = {i,j};return arr;}}}return new int[]{-1,-1};
}

6.给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

注意:

1、n ^ n = 0;即两个相同的数字异或是0

2、0 ^ n = n;即0和任何数字进行异或,结果就是那个任何数字。

public static void main(String[] args) {int[] array = {1,3,3,1,4,8,4};int ret = func(array);System.out.println(ret);
}public static int func(int[] array) {int ret = array[0];for (int i = 1; i < array.length; i++) {ret ^= array[i];}return ret;
}

7.存在连续三个奇数的数组

给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 true ;否则,返回 false 。

示例 1:

输入:arr = [2,6,4,1]

输出:false

解释:不存在连续三个元素都是奇数的情况。

示例 2:

输入:arr = [1,2,34,3,4,5,7,23,12]

输出:true

解释:存在连续三个元素都是奇数的情况,即 [5,7,23] 。

思路:数字是连续出现的,所以我们只需要定义一个计数器,如果连续出现的次数超过3,则返回true。

public static void main(String[] args) {int[] arr = {2,6,4,1};boolean ret = func(arr);System.out.println(ret);int[] arr1 = {1,2,34,3,4,5,7,23,12};boolean ret1 = func(arr1);System.out.println(ret1);
}public static boolean func(int[] array) {int count = 0;for (int i = 0; i < array.length; i++) {if(array[i] % 2 != 0) {count++;}if(count == 3) {return true;}}return false;
}

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

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

相关文章

H3CNE综合实验之机器人

H3CNE综合实验之机器人 实验拓扑图实验需求 1.按照图示配置 IP 地址 2.SW1 和 SW2 之间的直连链路配置链路聚合 3.公司内部业务网段为 Vlan10 和 Vlan20;Vlan10 是市场部&#xff0c;Vlan20 是技术部&#xff0c;要求对 Vlan 进行命名以识别; ​ PC8 属于 Vlan10&#xff0c…

2025/7/15——java学习总结

Java IO、Stream、异常与 File 全体系总结&#xff1a;从基础到进阶的完整突破一、核心知识深耕&#xff1a;四大模块的体系与底层逻辑&#xff08;一&#xff09;IO 流&#xff1a;数据传输的基础通道体系架构与核心分类按流向&#xff1a;输入流&#xff08;InputStream/Read…

【轨物方案】当补贴退潮,光伏电站如何回归价值本质?

中国光伏产业正站在一个历史性的拐点。过去&#xff0c;国家补贴的“黄金时代”催生了装机量的爆发式增长&#xff0c;许多电站在建设初期将重心放在了快速并网&#xff0c;却忽视了贯穿2-30年生命周期的运维规划。如今&#xff0c;补贴浪潮逐渐退去&#xff0c;各大企业开始从…

群晖Nas - Docker(ContainerManager)上安装SVN Server和库权限设置问题

上次安装了Gitlab&#xff0c;可以参考这篇&#xff08;群晖Nas - Docker&#xff08;ContainerManager&#xff09;上安装GitLab&#xff09;&#xff0c;今天来搞SVN服务器&#xff0c;废话不多说。 下载镜像 还是先下载镜像&#xff08;garethflowers/svn-server&#xff…

前端打包自动压缩为zip--archiver

安装依赖 pnpm add archiver types/archiver/vitePlugins/autoBuildZip.ts import { Plugin } from vite; import archiver from archiver; import fs from fs;const compressFolder (folderPath: string, outputFilePath: string) > {const output fs.createWriteStream(…

React响应式组件范式:从类组件到Hooks

​引言 在UI开发中&#xff0c;"状态变化自动触发UI更新"的响应式机制是构建动态界面的核心。React通过独特的​​单向数据流​​和​​虚拟DOM&#xff08;Virtual DOM&#xff09;​​ 实现这一目标&#xff0c;但类组件&#xff08;Class Components&#xff09;…

com2tcp工具

com2tcp 是 com0com 套件中的一个实用工具&#xff0c;用于将本地串口&#xff08;COM&#xff09;数据转发到 TCP/IP 网络&#xff0c;或者将 TCP/IP 数据转发到本地串口&#xff0c;实现串口数据的网络透传。 1. com2tcp 基本用法 &#xff08;1&#xff09;安装 com0com 从…

MySQL实操:将Word表格数据导入MySQL表

文章目录 1. 提出任务1.1 Word表格数据1.2 查看商品空表1.3 任务要求2. 完成任务2.1 借助AI2.1.1 利用AI生成SQL语句2.1.2 在Navicat里执行查询2.1.3 查看商品表记录2.2 借助Excel2.2.1 将Word表格数据复制到Excel2.2.2 新建商品表2.2.3 利用导入向导将电子表格数据导入商品表2…

什么是Podman?能否替代Docker?Podman快速入门

什么是PodmanPodman&#xff08;POD Manager&#xff09;是一个开源的无守护进程&#xff08;daemonless&#xff09;容器引擎&#xff0c;用于管理容器、容器镜像、容器卷和网络。它兼容 OCI 标准&#xff0c;可以运行 Docker 镜像&#xff0c;并且设计上与 Docker CLI 命令高…

开通保存图片权限

直接粘贴就可以用 上干货 可以的话希望点个start/* 小程序特有相关 */mp-weixin: {appid: VITE_WX_APPID,setting: {urlCheck: false,minified : true //是否压缩js},usingComponents: true,"lazyCodeLoading": "requiredComponents", //按需注入"pe…

【赵渝强老师】大数据交换引擎Sqoop

Sqoop是SQL To Hadoop的简称&#xff0c;它是一款开源的工具&#xff0c;主要用于在Hadoop&#xff08;Hive&#xff09;与传统的数据库&#xff08;Oracle、MySQL等&#xff09;间进行数据的传递。通过使用Sqoop可以将一个关系型数据库中的数据导进到Hadoop的HDFS中&#xff0…

C++进阶-map的应用

目录 1.预备知识 2.map的补充知识 2.1map的插入方式 2.2访问键和值 2.3map::operator[]的补充 2.4另外一些map的成员函数的补充 3.map的应用实践-力扣刷题-前k个高频单词 3.1解法1 3.2解法2 3.3解法3 4.map的应用实践-力扣刷题-随机链表的复制 4.1C语言解法 4.2C解…

【三维重建工具】NeRFStudio、3D GaussianSplatting、Colmap安装与使用指南

目录 一、NeRFStudio安装1.安装&#xff08;ubuntu系统&#xff09;2.安装&#xff08;windows系统&#xff09; 二、安装tinycudann三、Colmap安装与使用1. 安装依赖2. 安装colmap3.使用colmap3.1 可视化界面使用3.2 Nerfstudio命令行调用Colmap3.3 colmap结果不准时的修复3.4…

Mybatis05-动态sql

一、应用场景MyBatis 的 动态 SQL 是指根据不同的条件动态拼接生成 SQL 语句的能力。它的最大优势是&#xff1a;避免写多个 XML 映射语句、避免 SQL 冗余、提升代码复用性和可维护性。示例1&#xff1a;用户可以通过勾选框&#xff0c;勾选不同的数据进行批量删除&#xff0c;…

VSCODE 选中多行 需要同时按住alt键才可以

在 VS Code 中&#xff0c;如果你发现 必须按住 Alt 键才能选中多行&#xff08;即“列选择”或“块选择”模式&#xff09;&#xff0c;而直接拖动鼠标无法多选&#xff0c;可能是由于以下原因导致的&#xff1a;1. 检查是否启用了“列选择模式”VS Code 默认情况下&#xff1…

2025前端面试真题以及答案-不断整理中,问题来源于牛客真题

一、 项目内存泄露react与vue的渲染机制有哪些不同react fiber架构vue2与3&#xff0c;为什么用proxy代替defineproperty性能优化有哪些三栏布局实现方式重排与重绘一个对话聊天框如何减少重排&#xff08;我回答的是绝对定位&#xff0c;将聊天框定位在下面&#xff0c;类似于…

雷军的 IP 革命:人格化力量如何重塑商业规则|创客匠人

小米 YU7 发布会 3 分钟售罄 20 万台的奇迹&#xff0c;撕开了一个时代真相&#xff1a;当商业竞争进入深水区&#xff0c;决定胜负的不再是产品参数&#xff0c;而是创始人 IP 的人格穿透力。雷军仅凭个人影响力撬动数十亿级交易&#xff0c;这绝非偶然&#xff0c;而是人格化…

SpringBoot3:应对C10K并发挑战的优化指南

嘿&#xff0c;哥们&#xff01;还在为服务的并发量上不去而头疼吗&#xff1f;用户量一上来&#xff0c;CPU、内存就告急&#xff0c;接口响应慢得像蜗牛&#xff1f;别慌&#xff0c;今天我们就来盘一盘&#xff0c;怎么用最新的Spring Boot 3&#xff0c;把服务性能调教到极…

响应式编程入门教程第三节:ReactiveCommand 与 UI 交互

响应式编程入门教程第一节&#xff1a;揭秘 UniRx 核心 - ReactiveProperty - 让你的数据动起来&#xff01; 响应式编程入门教程第二节&#xff1a;构建 ObservableProperty&#xff1c;T&#xff1e; — 封装 ReactiveProperty 的高级用法 响应式编程入门教程第三节&#x…

500+技术栈覆盖:Web测试平台TestComplete的对象识别技术解析

在用户界面&#xff08;UI&#xff09;测试领域&#xff0c;传统的测试工具往往依赖于XPath或CSS选择器来定位页面元素。然而&#xff0c;在面对动态变化的界面、多语言支持或是跨越多种技术框架的应用时&#xff0c;这些传统方法常导致脚本失效&#xff0c;增加了维护成本。 …