十、数组进阶

EduCoder实训机器学习 头歌实训 阅读详情

第1关:数组的复制


任务描述
本关任务:完成将一个数组的值复制给另一个数组。

相关知识
本关需要你完成数组的复制操作,可以分三个步骤来实现。

创建一个数组arr2,数组长度和数组arr1相同;

使用循环将数组1中的每一个数据赋值给数组2中对应的那一项。(即arr2[0] = arr1[0]);

循环输出复制之后arr2中的所有数据。

编程要求
在右侧编辑器Begin-End中填充代码,将arr1数组中的数据全部复制给arr2数组,最后输出arr2中所有的数据。

测试说明
我会对你的程序进行测试,如下:
测试输入:1,3,12
预期输出:

1
3
12

测试输入:2,13,11
预期输出:

2
13
11

代码实现

package step1;
 
import java.util.Scanner;
 
public class HelloWorld {
	public static void main(String[] args) {
		//动态构建arr1
		int[] arr1 = new int[3];
		Scanner sc = new Scanner(System.in);
		for(int i = 0 ; i< arr1.length ; i++){
			arr1[i] = sc.nextInt();
		}
		/********** Begin **********/
		//创建数组arr2
        int[] arr2 = new int[arr1.length];
 
        //使用for循环将arr1的数据复制给arr2
 
        for (int j = 0; j < arr1.length; j++) {
            arr2[j] = arr1[j];
        }
 
        //输出arr2
        for (int array : arr2)
            System.out.println(array);
		/********** End **********/
	}
}

第2关:数组中元素的查找


任务描述
本关任务:完成查找字符串数组中指定字符串位置的小程序。

相关知识
为了完成本关任务,你需要知道:如何判断两个字符串是否相等。

如何判断字符串相等
我们之前判断两个数是否相等使用的是符号,我们判断字符串是否相等能否用符号呢?我们来看一段代码。

在这里插入图片描述

输出结果:
在这里插入图片描述

为什么呢?
是因为==比较的是两个对象的内存地址,我们知道变量被创建的时候就相当于在内存中开辟空间,而案例中str和str1就是占用的两块不同的空间,所以他们的内存地址是不一致的,在用 ==符号判断的时候就不相等了,即为false。
在这里插入图片描述

也许你会这样子尝试:
在这里插入图片描述

这个时候的输出结果就可能会让你感觉疑惑:
在这里插入图片描述

这又是什么原因呢?是因为定义String str = "hello"和String str1 = "hello"没有进行对象的创建,而是同时指向的一个对象,所以他们的内存地址是相同的。
在这里插入图片描述

问题来了,既然==不能用,那我们应该用什么呢?

在Java中判断两个字符串是否相等,需要使用equals方法;

语法:字符串1.equals(字符串2) 如果字符串1等于字符串2返回true,否则返回false;
例如:
在这里插入图片描述

输出: str与str1是否相等true

编程要求
在右侧编辑器Begin-end处填充代码,实现在数组中查找指定字符串位置的功能。

测试说明
测试输入:张三
预期输出:张三在数组的第1个位置

测试输入:张富贵
预期输出:张富贵在数组的第5个位置

代码实现

package step2;

import java.util.Scanner;

public class HelloWorld {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		//str为要查找的字符串
		String str = sc.next();
		
		/********** Begin **********/
		//创建数组   arr  给数组赋值 {"张三","张三丰","张无忌","王二麻子","张富贵"}
		String[] arr = {"张三", "张三丰", "张无忌", "王二麻子", "张富贵"};
		for(int i = 0;i < arr.length;i++)
        {
            int j = i+1;
            if (str.equals(arr[i]))
            System.out.println(str + "在数组的第" + j + "个位置");
        }
		

		
		
		
		/********** End **********/
	}
}

第3关:交换算法


任务描述
本关任务:完成两个数(a与b)的交换。

相关知识
看到这个问题,也许你的第一想法就是:

int a = 3;
int b = 4;
a = b;
b = a;
System.out.println(a);
System.out.println(b);

问题真有那么简单吗?猜猜这段程序输出的结果吧!

我们在之前的章节中提到过,变量就相当于一个杯子,每一个变量相当于不同的杯子,本关要完成的两个变量的交换,可以看做是将两个杯子中装的液体进行交换,请你思考一下如何将两个杯子中的液体交换呢?
在这里插入图片描述

只有两个杯子能不能完成呢?

如果是三个杯子呢?

在这里插入图片描述

编程要求
是时候检验一下啦,在右侧编辑器Begin-end中填充代码,完成两个变量的交换吧。

测试说明
测试输入:3,5
预期输出:

5
3

测试输入:4,2
预期输出:

2
4

代码实现

package step3;

import java.util.Scanner;

public class HelloWorld {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		/********** Begin **********/
		//将a的值赋给b   b的值赋给a
			int temp=a;
        a=b;
        b=temp;

		
		
		
		

		/********** End **********/
		System.out.println(a);
		System.out.println(b);
	}
	
}

第4关:选择排序


任务描述
本关任务:实现数组从大到小的排序(降序排序)。

相关知识
为了解决数组排序的问题你需要先了解:选择排序。

选择排序
关于选择排序,你可以理解为一个循环打擂台的过程,还记得我们在上一章节中求数组中的最大值吗?
在这里插入图片描述

我们运用打擂台的原理,可以求出数组中的最大值。
核心代码:

int max = scores[0];
for (int i = 1; i < scores.length; i++) {
    if(max < scores[i]){    //求最大值
    max = scores[i];
    }
}

这样一轮循环之后我们就可以求出数组scores的最大值。
第一轮擂台赛求出最大值之后,我们可以对接下来的数据再进行打擂台的操作,就出剩下数据的最大值(也就是第二大的值),以此类推,就可以实现数组从大到小的排序。

实现过程
为了实现选择排序,我们需要求出最大值,并且和相比较的数据交换位置:接下来我们对数组int[] arr = {6,5,8,0,2,9}来进行第一趟循环,将最大值移动到数组的第一位。
在这里插入图片描述

代码实现:

int[] arr = {6,5,8,0,2,9};
for (int i = 0; i < arr.length-1; i++) {
    if(arr[0] < arr[i+1]){
        int temp = arr[0];
        arr[0] = arr[i+1];
        arr[i+1] = temp;
    }
}

一次循环操作就可以找出数组中的最大值,并将其移动到数组的首位,所以对于一个长度为6的数组,我们只需要进行5(length-1)次上述操作即可将数组降序排序了。

接下来我们进行第二趟循环,求第二大的值,并将其移动到数组的第二个位置。因为我们已经求出了最大值,所以这一次循环,最大值不用参与比较。
在这里插入图片描述

代码实现:

在这里插入图片描述

结果:[9, 8, 5, 0, 2, 6]

可以发现经过两轮循环我们找出了数组中最大的两个值,并且移动他们到了数组的前两位。

现在按照上述步骤就可以实现数组的排序了,不过如果我们照搬上述代码,就会有很多冗余的代码,所以需要你来改进,怎么改进是需要你思考的。

告诉你一个秘密:使用Arrays.toString(数组)可以直接输出数组中的值哦!
如下:
在这里插入图片描述

输出结果:[6, 5, 8, 0, 2, 9]

思考题
本关所讲述的选择排序是一个简化版本,如果你想要学习优化版可以根据下列图片,编写出相应代码,然后在评论区贴出来哦。

在这里插入图片描述

上图就是一个使用选择排序将一个数组中数据从小到大排序的过程,请思考如何用代码实现上述过程。

原理:每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

本关难度较大,但这是学习数组绕不过去的一关,多思考,多尝试,你能成功的,加油!

编程要求
在右侧Begin-End区域中添加代码,实现对数组arr的降序排序,并输出排序后的arr数组。

测试说明
我会对你的程序进行测试;
预期输入:6,6,5,0,2,8,9
预期输出:[9, 8, 6, 5, 2, 0]

预期输入:4,3,12,1,13
预期输出:[13, 12, 3, 1]

代码实现

package step4;

import java.util.Arrays;
import java.util.Scanner;

public class HelloWorld {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//动态创建数组
		int[] arr = new int[sc.nextInt()];
		for(int i = 0 ; i< arr.length ; i++){
			arr[i] = sc.nextInt();
		}
		/********** Begin **********/
		for(int i = 0;i<arr.length-1;i++)
        {
             int k = i;
            for (int j = k + 1; j < arr.length; j++) {
                if (arr[j] > arr[k]) {
                    k = j;
                }
            }
        if(i != k)
        {
            int temp = arr[i];
            arr[i]=arr[k];
            arr[k]=temp;
        }
        }
        System.out.println(Arrays.toString(arr));
		
		/********** End **********/
	}
}

第5关:冒泡排序


任务描述
本关任务:使用冒泡排序实现数组的升序排序(从小到大)。

相关知识
冒泡排序
在这里插入图片描述

看完上图,相信你已经能明白冒泡排序的原理了。

将序列当中的左右元素,依次比较,如果左边的元素大于右边元素则交换位置,保证右边的元素始终大于左边的元素;( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;)对序列当中剩下的n-1个元素再次执行步骤1。对于长度为n的序列,一共需要执行n-1轮比较。

在代码中实现一轮比较:

在这里插入图片描述

输出结果:[5, 8, 0, 2, 6, 9]

编程要求
在编辑器Begin-end处填充代码,使用冒泡排序对数组arr进行升序排序,最后输出排序之后数组arr中的数据。

测试说明
预期输入:6,9,5,8,0,2,6
预期输出:[0, 2, 5, 6, 8, 9]

预期输入:4,3,12,13,0

预期输出:[0, 3, 12, 13]

代码实现

package step5;

import java.util.Arrays;
import java.util.Scanner;

public class HelloWorld {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//动态创建数组
		int[] arr = new int[sc.nextInt()];
		for(int i = 0 ; i< arr.length ; i++){
			arr[i] = sc.nextInt();
		}
		/********** Begin **********/
	  for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
		
		/********** End **********/
	}
}	
EduCoder Java入门 - 数组进阶 第1关:数组的复制 任务描述 本关任务:完成将一个数组的值复制给另一个数组。 相关知识 本关需要你完成数组的复制操作,可以分三个步骤来实现。 创建一个数组arr2,数组长度和数组arr1相同; 使用循环将数组1中的每一个数据赋值给数组2中对应的那一项。(即arr2[0] = arr1[0]); 循环输出复制之后arr2中的所有数据。 编程要求 在右侧编辑器Begin-End中填充代码,将arr1数组中的数据全部复制给arr2数组,最后输出arr2中所有的数据。 测试 阅读详情

相关推荐

指针数组进阶

前言:指针与数组的知识往往让我们无法给自己定位,似乎是懂了,但真的碰上了又一言难尽。接下来有一些关于指针与数组的知识和例题讲解,来看看你对指针和数组到底有多了解吧! 指针与数组中的sizeof与strlen 1、sizeof sizeof值关注占用空间的大小,单位是字节,不关注元素的类型,是一个操作符。 2、strlen strlen是计算字符串中\0之前出现了多少个字符,只针对字符串,是一个库函数。 3、数组名 数组名是数组首元素地址,但是在这里有两个例外: (1)sizeof(数组名)

m0_56064145的博客 3452

每天一遍,快乐再见!LeetCode(40)多数元素

40天纪念日

weixin_43493559的博客 333

Java入门 - 数组进阶

第1关:数组的复制 本关任务:完成将一个数组的值复制给另一个数组。 package step1; import java.util.Scanner; public class HelloWorld { public static void main(String[] args) { //动态构建arr1 int[] arr1 = new int[3]; Scanner sc = new Scanner(System.in); for(i

Junds0的博客 2619

JAVA头哥作业08 Java入门 - 数组进阶

处填充代码,实现在数组中查找指定字符串位置的功能。中填充代码,完成两个变量的交换吧。进行升序排序,最后输出排序之后数组。是时候检验一下啦,在右侧编辑器。处填充代码,使用冒泡排序对数组。区域中添加代码,实现对数组。的降序排序,并输出排序后的。数组中的数据全部复制给。

nianci602的博客 5463

深入解析路科验证V0实验lab1:SV接口与时钟块实战

本文深入解析了路科验证V0实验Lab1的核心内容,重点阐述了SystemVerilog接口与时钟块在验证环境搭建中的关键作用。通过拆解router_io接口设计、时钟块同步机制及程序块封装,详细讲解了如何构建稳定可靠的验证通信基础,并提供了复位时序分析与常见调试技巧,为后续复杂验证打下坚实基础。

peach的博客 430

STM32HAL库学习笔记九——LCD显示

本文不会对驱动编写做特别详细的描述,以记录CubeMX的部署流程为主。

weixin_44762233的博客 6918

JavaScript进阶(十):Array 数组详解

JS array 数组详解数组的声明方法arrayObj = new Array();//创建一个数组。 var arr1 = new Array(); arrayObj = new Array([size])//创建一个数组并指定长度,注意不是上限,是长度。 var a = new Array(5); arrayObj = new Array([element0[, element1[, ..

IT全栈 华强工作室 4万+

射频接收机本振相噪指标计算:从倒易混频到GSM实战

在射频接收机设计中,相位噪声是衡量本振信号频谱纯度、影响系统灵敏度的关键指标。其核心影响机制源于倒易混频原理:当不纯净的本振信号与强带外阻塞信号混频时,本振的噪声边带会被转换到中频通带内,从而抬升接收机噪声基底。这一过程直接决定了接收机在阻塞测试等场景下的性能极限。从技术价值看,精确计算本振相噪要求,是进行系统噪声预算、实现成本与性能权衡的核心依据。尤其在手机、基站等对灵敏度要求极高的应用中,它指导着锁相环和压控振荡器的选型与设计。本文以经典的GSM DCS1800标准为例,通过详细的公式推导与变量分析,演

weixin_30368405的博客 327

BCB高手进阶(十)如何实现控件数组

在C++ Builder中,没有提供像VB中控件数组的功能,很令遗憾。经过一番琢摸,终于解决了这个问题。技巧不敢独享,奉献出来供大家交流。在VB中,控件数组可以 :允许多个控件共享同一个事件句柄 提供了运行期间增加一个控件的机制 提供了一种方便的组合控件的方法。 前两项在C++ Builder中早已实现,而且CB更有一个优点。即不同类型的控件可以使用相同的句柄(只需在相

开心果的专栏 1880

告别手动复制粘贴!用Python脚本+pywinauto实现PC微信消息自动发送(附完整源码)

本文详细介绍了如何利用Python和pywinauto实现PC微信消息的自动化发送,告别繁琐的手动操作。从环境搭建、UI控件定位到构建健壮的发送流程,再到高级功能扩展和项目打包部署,全面解析了自动化办公的实现方案,显著提升工作效率。

weixin_30315723的博客 585

AvFrame和AvPacket

在FFmpeg中,未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存;针对视频编码器,其流程为从数据源获取图像格式的输入数据,保存为AVFrame对象并传入编码器,从编码器输出AVPacket结构。

Lce的专栏 3236

JavaScript进阶(十):Array 数组详解_js用new array定义长度为1的数组

不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!//指创建一个数组,长度为1,并且第一位是5。//指创建长度为5的数组。(jsx可以进行更多的js逻辑和操作)5)vue:组件之间的通信(props,callback,emit)//创建一个数组并赋值的简写,注意这里中括号不表示可省略。//创建一个数组并指定长度,注意不是上限,是长度。2)状态管理(react)//创建一个数组并赋值。3)对象属性(vue)

2201_75604580的博客 721

因果强化学习:优化决策策略的因果方法

1. 背景介绍 1.1 传统强化学习的局限性 强化学习(Reinforcement Learning, RL)是一种通过与环境交互来学习最优决策策略的方法。然而,传统强化学习方法在面对复杂、动态和不确定的现实世界问题时,往往存在以下局限性: 数据效率低:传统强化学习方法

AI天才研究院 658

python socket发送数组_Python 进阶(十):网络编程

1. 简介网络编程主要的工作就是在发送端将信息通过指定的协议进行组装包,在接收端按照规定好的协议对包进行解析并提取出对应的信息,最终达到通信的目的。传输协议主要有 TCP 和 UDP,TCP 需要建立连接,是可靠的、基于字节流的协议,通常与 IP 协议共同使用;UDP 不需要建立连接,可靠性差,但速度更快。网络编程有一个重要的概念 socket(套接字),应用程序可以通过它发送或接收数据,套接字允...

weixin_39846089的博客 2万+

【YOLO】Mask Proto分支理解

Mask Proto分支通过解耦全局原型与实例参数,在保持YOLO实时性的同时实现精准分割。其技术核心在于利用多尺度特征生成可组合的原型,结合动态系数适应不同目标形态。未来可进一步融合Transformer的注意力机制,增强对复杂场景的建模能力。

浩瀚之水的专栏 476

SSD |(二)SSD主控

控制器作为一个片上系统,处理来自用户端的命令并负责管理闪存颗粒。

知识库搭建ing 1960

【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

本文并不讲C语言的基础 文章目录1 空struct的大小2 结构体与柔性数组2.1 柔性数组的使用方法2.2 柔性数组使用代码案例分析3 C语言中的union分析3.1 使用union判断系统大小端4 总结 1 空struct的大小 C语言中的struct可以看成是变量的集合 如果一个struct里面什么都没有,是空的,那么它的大小是多少呢?(不考虑C++语言的特性) 实际上这在不同...

厚积薄发 1896

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【算法提高篇】(十)树状数组模板题全解析:从基础到进阶,刷完这 6 道吃透 BIT

本文系统介绍了树状数组(BIT)的6个经典模板题,涵盖一维和二维场景下的单点修改、区间查询、区间修改等操作。通过详细解析每道题的数学推导、核心思路和C++实现,帮助读者掌握树状数组的核心思想:lowbit操作与差分/前缀和技巧。文章特别强调数据类型处理、输入输出优化、边界判断等实战细节,并建议由浅入深地学习,通过手动推导和调试测试加深理解。最后总结各题型的对应关系和通用解题技巧,为算法竞赛和面试笔试提供全面的树状数组解决方案。

2301_79248256的博客 948

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++进阶剖析( 十 六)之字符串类,数组访问操作符,经典问题三

1.1 1.1.1 1.1.2 1.1.3 1.2 1.2.1 1.2.2 1.2.3 1.3实例 1.3.1 1.3.2 1.3.3 1.4 1.4.1 1.4.2 1.4.3 1.5 1.5.1 1.5.2 1.5.3 参考一 :狄泰软件学院C++进阶剖析 参考二 : C++ primer中文版

海是倒过来的天的博客 259

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

夕拾算法进阶篇:21)最长公共子串(DP+后缀数组)

动态规划 这里首先区分最长最长公共子序列和最长公共子串,子串要求是连续的,而序列不要求,在之前的博客中讨论过如果用DP来解决最长公共序列的问题,子串和子序列的解决方法类似。 令二维数组dp[i][j]表示字符串A的i号位和字符串B的j号位之前的最长公共子序列,如dp[4][6]表示“sads”和“admins”的最长公共子序列长度。那么A[i]和B[j]可以分为2种情况: (1)A[i]

Javis486的专栏 711

C语言进阶之路-数组与指针

本文细讲了打怪路上的数组和指针的特点和消灭方法,各位只需认真学习,即可消灭它们。祝各位都可爬上C语巅峰,斩尽拦路小妖。

志不在此,打卡留念 2374

C语言进阶:指针进阶(字符指针、指针数组、数组指针)

C语言进阶,指针进阶,对于指针更加深入的了解

2501_91709575的博客 2953

深入浅出 Java 数组:从基础到进阶

优点缺点存储相同类型的一组值数组的长度固定,无法动态调整访问元素速度快如果需要动态存储,需要使用其他数据结构,例如链表方便操作数组越界和空指针错误是常见的错误类型概念描述示例数组用来存储相同数据类型的一组值,每个元素都有唯一的索引数组创建使用new关键字或直接赋值初始化或数组访问使用索引访问数组元素,索引从 0 开始// 输出第一个元素的值数组遍历使用循环遍历数组元素使用for循环或增强for循环遍历数组排序使用方法对数组进行排序数组查找使用。

weidl001的博客 1356

php进阶笔记之数组

以下为慕课网php进阶篇的个人php进阶学习笔记,用于自己复习查看。 索引数组赋值有三种方式: 第一种:用数组变量的名字后面跟一个中括号的方式赋值,当然,索引数组中,中括号内的键一定是整数。比如,$arr[0]='苹果'; 第二种:用array()创建一个空数组,使用=>符号来分隔键和值,左侧表示键,右侧表示值。当然,索引数组中,键一定是整数。比如,arr

ming0513的专栏 556

C 语言数组:从基础到进阶的全面解析

C语言数组可存同类型元素集合。能声明、初始化、按索引访问,可求长度。还有多维、传参、返回等用法,分静态与动态数组 。

Smell_of_earth的博客 685

进阶版树状数组

我们都知道树状数组一般有两种形式 1.最为传统的版本,支持区间求和,单点修改 2.差分树状数组 支持区间修改,单点查询 而进阶版树状数组 可支持 区间求和,区间修改 其原理是: 设tree[i]=a[i]-a[i-1](差分),那么容易得到: tree[1]+tree[2]+……+tree[i]=a[i]这个公式 维护tree数组即可以实现区间修改了。 接下来是区间查询的实现问题 ...

菱形继承 485
上一篇: 九、数组基础
下一篇: 十二、类与对象
请你吃茶去
博客等级 码龄6年 704粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请你吃茶去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值