“手撕“数组一些简单的习题

目录

1.数组转字符串

2.数组拷贝

3.求数组中元素的平均值

4.查找数组中指定元素(顺序查找)

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

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

7.数组逆序


1.数组转字符串

先让我们看看为什么要转字符串:

int[] arr = {1,2,3,4,5,6};
System.out.println(arr);
// 执行结果
[I@4eec7777     //一个地址

也就是说我们直接打印数组出来的会是一个地址,因为数组里面存的其实是值的地址

代码如下:  

int[] arr = {1,2,3,4,5,6};
String newArr = Arrays.toString(arr);
System.out.println(newArr);
// 执行结果
[1, 2, 3, 4, 5, 6]

 Arrays.toString其实是一个方法,它可以直接帮我打印数组里面的值转成字符串。

Java 中提供了 java.util.Arrays 包, 其中包含了一些操作数组的常用方法.

2.数组拷贝

我们有Java提供的Arrays.copyOf方法:

代码如下:  

public static void func(){
// newArr和arr引用的是同一个数组
// 因此newArr修改空间中内容之后,arr也可以看到修改的结果
int[] arr = {1,2,3,4,5,6};
int[] newArr = arr;
newArr[0] = 10;
System.out.println("newArr: " + Arrays.toString(arr));
// 使用Arrays中copyOf方法完成数组的拷贝:
// copyOf方法在进行数组拷贝时,创建了一个新的数组
// arr和newArr引用的不是同一个数组
arr[0] = 1;
newArr = Arrays.copyOf(arr, arr.length);
System.out.println("newArr: " + Arrays.toString(newArr));
// 因为arr修改其引用数组中内容时,对newArr没有任何影响
arr[0] = 10;
System.out.println("arr: " + Arrays.toString(arr));
System.out.println("newArr: " + Arrays.toString(newArr));
// 拷贝某个范围.
int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);
System.out.println("newArr2: " + Arrays.toString(newArr2));
}

那它和int[] newArr=arr有上面本质区别呢? 

 

 

copyOf是重新创建一个新的空间把原来的值放进去,对newArr操作时,不会修改arr的值;而int[] newArr=arr是直接存着数组原来的地址,所以操作的时候,arr的值也会被修改。

我们当然也可以实现自己的拷贝数组的方法:

代码如下:  

public static int[] copyOf(int[] arr) {int[] ret = new int[arr.length];for (int i = 0; i < arr.length; i++) {ret[i] = arr[i];
}return ret;
}

3.求数组中元素的平均值

 给定一个整型数组, 求平均值

代码如下:  

public static void main(String[] args) {int[] arr = {1,2,3,4,5,6};System.out.println(avg(arr));
}
public static double avg(int[] arr) {int sum = 0;for (int x : arr) {sum += x;
}return (double)sum / (double)arr.length;
}
// 执行结果
3.5

4.查找数组中指定元素(顺序查找)

给定一个数组, 再给定一个元素, 找出该元素在数组中的位置. 

代码如下:  

public static void main(String[] args) {int[] arr = {1,2,3,10,5,6};System.out.println(find(arr, 10));
}
public static int find(int[] arr, int data) {for (int i = 0; i < arr.length; i++) {if (arr[i] == data) {return i;
}
}return -1; // 表示没有找到
}
// 执行结果
3

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

针对有序数组, 可以使用更高效的二分查找。

那啥是有序数组,

有序分为 "升序" 和 "降序",比如:

1,2,3,4,5就是升序,为有序数组

5,4,3,2,1就是降序,也为有序数组 

以升序数组为例, 二分查找的思路是先取中间位置的元素, 然后使用待查找元素与数组中间元素进行比较: 

如果相等,即找到了返回该元素在数组中的下标

如果小于,以类似方式到数组左半侧查找

如果大于,以类似方式到数组右半侧查找 

代码如下:  

public static void main(String[] args) {int[] arr = {1,2,3,4,5,6};System.out.println(binarySearch(arr, 6));
}
public static int binarySearch(int[] arr, int toFind) {int left = 0;int right = arr.length - 1;while (left <= right) {int mid = (left + right) / 2;if (toFind < arr[mid]) {
// 去左侧区间找right = mid - 1;
} else if (toFind > arr[mid]) {
// 去右侧区间找left = mid + 1;
} else {
// 相等, 说明找到了return mid;
}
}
// 循环结束, 说明没找到return -1;
}
// 执行结果
5

 随着数组元素个数 越多, 二分的优势就越大。

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

给定一个数组, 让数组升序 (降序) 排序。这里以升序举例:

 

代码如下: 

public static void main(String[] args) {int[] arr = {9, 5, 2, 7};bubbleSort(arr);System.out.println(Arrays.toString(arr));
}
public static void bubbleSort(int[] arr) {for (int i = 0; i < arr.length; i++) {for (int j = 1; j < arr.length-i; j++) {
if (arr[j-1] > arr[j]) {int tmp = arr[j - 1];arr[j - 1] = arr[j];arr[j] = tmp;
}
}
} // end for
} // end bubbleSort
// 执行结果
[2, 5, 7, 9]

 冒泡排序性能较低. Java 中内置了更高效的排序算法(Arrays.sort方法):

public static void main(String[] args) {int[] arr = {9, 5, 2, 7};Arrays.sort(arr);System.out.println(Arrays.toString(arr));
}

7.数组逆序

给定一个数组, 将里面的元素逆序排列。

代码如下:  

public static void main(String[] args) {int[] arr = {1, 2, 3, 4};reverse(arr);System.out.println(Arrays.toString(arr));
}
public static void reverse(int[] arr) {int left = 0;int right = arr.length - 1;
while (left < right) {int tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;
}
}

思路:设定两个下标, 分别指向第一个元素和最后一个元素,

交换两个位置的元素. 然后让前一个下标自增, 后一个下标自减, 循环继续即可。

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

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

相关文章

03-JAVA设计模式-迭代器模式

迭代器模式 什么是迭代器模式 迭代器模式&#xff08;demo1.Iterator Pattern&#xff09;是Java中一种常用的设计模式&#xff0c;它提供了一种顺序访问一个聚合对象中各个元素&#xff0c;而又不需要暴露该对象的内部表示的方法。迭代器模式将遍历逻辑从聚合对象中分离出来…

如何用flutter写一个好的登录页面

编写一个好的登录页面是构建用户友好且安全的移动应用的重要一步。下面是使用Flutter编写一个好的登录页面的一些建议和步骤&#xff1a; 1. 设计用户界面 1.简洁明了的布局&#xff1a;确保界面简洁明了&#xff0c;不要过分复杂&#xff0c;避免用户感到困惑。 2.清晰的输入框…

部队营区无线广播-部队营区无线广播音频智能管理播控系统建设浅析

部队营区无线广播音频智能管理播控系统技术方案 由北京海特伟业科技任洪卓发布于 2024年4月16日 一、部队营区无线广播音频智能管理播控系统建设要求 为了响应上级关于恢复播放作息号的指示精神&#xff0c;提升广播系统在部队营区管理中的重要性和可塑性&#xff0c;某部营区…

Docker Container (容器) 常见命令

Docker 容器的生命周期 什么是容器&#xff1f; 通俗地讲&#xff0c;容器是镜像的运行实体。镜像是静态的只读文件&#xff0c;而容器带有运行时需要的可写文件层&#xff0c;并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除…

Python中的设计模式与最佳实践【第166篇—设计模式】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的设计模式与最佳实践 在软件开发中&#xff0c;设计模式是一种解决常见问题的经过…

TCP网络程序

上一章我们基于UDP实现了几个网络程序&#xff0c;这一章我们开始使用TCP。 先简单复习一下TCP和UDP的特点&#xff1a; TCP特点 传输层协议有连接可靠传输面向字节流 UDP特点 传输层协议无连接不可靠传输面向数据报 可以看到TCP是有链接的&#xff0c;而UDP是无连接的&#…

最优算法100例之51-链表的第一个公共结点

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 寻找6 题解报告 思路: (1)使用栈,依次将两个链表入栈,然后出栈&#x

十大排序——7.希尔排序

下面我们来看一下希尔排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 希尔排序是插入排序的一种优化&#xff0c;可以理解为是一种分组的插入排序。 希尔排序的要点&#xff1a; 简单来说&#xff0c;就是分组实现插入&#xff0c;每组元素的间隙称为gap&#xff0c;…

【核心完整复现】基于目标级联法的微网群多主体分布式优化调度

1 主要内容 之前发布了华电学报的复现程序《基于目标级联法的微网群多主体分布式优化调度》&#xff0c;具体链接为【防骗版】基于目标级联法的微网群多主体分布式优化调度&#xff0c;虽然对模型及结果进行了复现&#xff0c;但是部分模型细节和参数并没有完全实现&#xff0…

微服务之网关路由

一、概述 1.1认识网关 什么是网关&#xff1f; 顾明思议&#xff0c;网关就是网络的关口。数据在网络间传输&#xff0c;从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。 更通俗的来讲&#xff0c;网关就像是以前园区传达室的大爷。 外…

2024中国内燃机展-北京汽车发动机零部件展

2024第二十三届中国国际内燃机与零部件展览会 由中国内燃机工业协会主办、中国机床专用技术设备有限公司、汽车工艺装备成套开发集团协办的2024中国国际内燃机及动力装备博览会&#xff08;简称“动博会”&#xff09;将于2024年10月11日-13日在亦创国际会展中心隆重举办。本届…

OpenHarmony开发案例:【分布式遥控器】

1.概述 目前家庭电视机主要通过其自带的遥控器进行操控&#xff0c;实现的功能较为单一。例如&#xff0c;当我们要在TV端搜索节目时&#xff0c;电视机在遥控器的操控下往往只能完成一些字母或数字的输入&#xff0c;而无法输入其他复杂的内容。分布式遥控器将手机的输入能力…