详解java一维数组及练习题实例

一维数组

1.一维数组的定义方式:

int[] array1 = new int[3];//声明创建一个包含3个元素的数组array1(初始值为0)

int[] array2 = {1, 2, 3};//声明、创建并初始化一个包含3个元素的数组

int[] array3 = new int[] {1, 2, 3};//声明、创建并初始化一个包含3个元素的整型数组

int[] array4;
array[4] = {1, 2, 3}//先声明一个数组array,再进行创建及初始化

int[] array5 = new int[3];
array5[0] = 1;
array5[1] = 2;
array5[2] = 3;//先声明、创建一个具有3个元素的数组,再用赋值语句进行初始化

2.利用一维数组输出斐波那契数列的前20项

public static void fib(int[] array) {
    array[0] = 1;
    array[1] = 1;
    for (int i = 2; i < array.length; i++) {
      array[i] = array[i - 1] + array[i - 2];
    }
    System.out.println(Arrays.toString(array));
}//记得在主函数中创建array数组

题目练习

1.实现二分查找算法:有序的数组

public class TestDemo1 {
  public static int binary(int[] array, int key) {//key为要查找的数
    Arrays.sort(array);//正序排列数组
    System.out.println("由从小到大顺序排列数组:" + Arrays.toString(array));
    int left = 0;
    int right = array.length - 1;//将数组最小下标与最大下标分别赋值给left和right
    int mid = 0;//将中值初始化
    while (left <= right) {//“=”条件防止当输入的值为数组最大下标指向的数时,不进入循环,而返回-1的情况
      mid = (left + right) / 2;//二分法原理为折半查找,故中间值为左右下标之和除以2
      if (key == array[mid]) {//如果第一次中间下标指向的值正好等于要查找的值,返回该下标
        return mid;
      } else if (key > array[mid]) {//如果如果输入的值大于中间下标指向的值,则将当前中值下标作为下一次循环的左下标
        left = mid + 1;/*“+1”的含义:防止输入的值为数组最大下标指向的值,当进行二分查找最后一步时,因为mid为int类型,所以会导
        致左边下标不在发生变化,所以要+1;当+1时,左边下标变为上一次中值下标的后一位,不影响此方法的正确性,还可以减少计算步骤*/
      } else {//只剩下输入的数下标小于中值下标的情况,将当前中值下标作为下次循环的右下标
        right = mid - 1;//与“+1”含义类似,防止输入的数对应的为最右下标
      }
    }
    return -1;//在数组中找不到输入的数,返回-1
  }

  public static void main(String[] args) {
    int[] array = {22, 15, -46, 35, 69, 20};
    System.out.println("请输入你想查找的数字:");
    Scanner scanner = new Scanner(System.in);
    int key = scanner.nextInt();
    System.out.println(binary(array, key));

  }
}

2.求连续子数组的最大和

public class TestDemo1 {
public static void sumArray(int[] array) {
    int sum = array[0];//对数组求和的变量
    int max = array[0];//求和最大值的变量
    for (int i = 1; i < array.length; i++) {//从第一项开始循环
      if (sum + array[i] < array[i]) {//如果前几项的和与本项之和小于本项,则最大连续子数组的和肯定不包括前几项
        sum = array[i];//将本项的值赋给sum,之后的循环求和从本项依次向后相加
      } else {
        sum = sum + array[i];//如果前几项的和与本项之和大于本项,则继续向后执行递加操作
      }
      if (sum >= max) {//每次相加之后与初始的max值相比较,如果和大于max的值,则更新max,最后返回的max值即为最大连续子数列的和
        max = sum;
      }
    }
    System.out.println("连续子数组最大和为:" + max);
  }
   public static void main(String[] args) {
    int[] array = {1, -2, 3, 10, -4, 7, 2, -5};
    sumArray(array);
      }
}

3.交换两个数

public class TestDemo1 {

	public static void swap(int a,int b) {
		int tmp = 0;
		tmp = a;
		a = b;
		b = tmp;
}

	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		swap(a,b);
		System.out.println(a);
		System.out.println(b);
  }
}

用上面写的方法在执行交换两个数操作数会出现错误,原因:

在主函数中swap(a,b)操作实际是将实参a,b的地址拷贝到swap方法中,即传址。在swap方法中进行数值交换操作时只是交换了该方法中形参的地址,而原本实参的地址并没有改变,所以输出的a,b值没有发生改变。

Java中的基本元素不支持传址,必须是对象或者数组才能传址

可作如下修改

class MyVlue {
  int data;
}
public class TestDemo1 {
  public static void swap(MyVlue myVlue,MyVlue myVlue2) {
    int tmp = myVlue.data;
    myVlue.data = myVlue2.data;
    myVlue2.data = tmp;
  }
  public static void main(String[] args) {
    MyVlue myVlue = new MyVlue();
    myVlue.data = 10;
    MyVlue myVlue2 = new MyVlue();
    myVlue2.data = 20;
    swap(myVlue,myVlue2);
    System.out.println(myVlue.data);
    System.out.println(myVlue2.data);
  }
}
//新建对象进行数值的交换,交换的是实参

4.逆置数组

public class TestDemo1 {
  public static void invertArray(int[] array) {
    System.out.println("输出该数组:" + Arrays.toString(array));
    for (int front = 0, end = array.length - 1; front < end; front++, end--) {//循环将数组下标由第一项递增,最后一项递减,当递增的下标超过递减的下标时,结束循环
      int temp = array[front];//将数组的第一个元素临时赋值给变量temp
      array[front] = array[end];//将数组最后的元素赋值到数组的第一个元素
      array[end] = temp;//将temp的值赋给数组最后的元素,实现数组下标不变,但元素的值进行倒置的操作
    }
    System.out.println("将该数组倒置后输出:" + Arrays.toString(array));
  }

  public static void main(String[] args) {
    int[] array = {1, 2, 3, 4, 5};
    invertArray(array);
  }
}

以上就是关于java一维数组及练习题的全部知识点内容,感谢大家的阅读和对我们的支持。

(0)

相关推荐

  • Java获取一维数组的最小值实现方法

    编写程序,实现接受用户在文本框中输入的单行数据.这些数据都是整数数字,以空格进行分隔,空格数量不限.并将这些数据分割成一维数组,再从数组中提取最小值显示在界面中.思路是先对用户的输入进行验证,即先用trim()函数过滤用户输入字符串的左右空格,若结果为空字符串则用JOptionPane类的showMessageDialog方法提示用户"请输入数字内容".若用户输入非空则使用charAt函数对用户输入字符串中的每一个字符进行判断,若其既非数字也非空格则提示"输入包含非数字内容&

  • Java编程一维数组转换成二维数组实例代码

    简介:由于经常在使用矩阵进行计算时,会首先将一维数组转为二维数组.因此,在这里记录一下,也希望对他人有帮助. 实例代码: package deal; public class ArryTest { public static void main(String[] args) { //创建一个一维数组 0,1,2,3...,10 double [] c= new double[10]; for (int i = 0; i < c.length; i++) { c[i]=i; } double[][

  • Java中增强for循环在一维数组和二维数组中的使用方法

    一维数组: int[] a={1,2,3}; for(int i:a) { System.out.print(i+" "); } 输出:1 2 3 二维数组: import java.util.Scanner; public class tet { public static void main(String[] args) { //int[][] b={{1,2,3},{4,5,6}};行 int[][] a=new int[5][];//必须明确行数 for(int i=0;i&l

  • 浅谈java中的一维数组、二维数组、三维数组、多维数组

    这个数组可以看做新手学习,从一维数组 到 多维 数组 循环渐进,其实看起也很简单,一看便知,众所周知,一维.二维或许经常用到,用到二维以上应该就很少了. public class test { public static void main(String[] args) { /*一维数组*/ int num[] = {0,1,2}; /*下面输出 3 行数据,0 ~ 2*/ for (int i = 0; i < num.length; i++) { System.out.println("

  • 详解java一维数组及练习题实例

    一维数组 1.一维数组的定义方式: int[] array1 = new int[3];//声明创建一个包含3个元素的数组array1(初始值为0) int[] array2 = {1, 2, 3};//声明.创建并初始化一个包含3个元素的数组 int[] array3 = new int[] {1, 2, 3};//声明.创建并初始化一个包含3个元素的整型数组 int[] array4; array[4] = {1, 2, 3}//先声明一个数组array,再进行创建及初始化 int[] ar

  • 详解Java中数组判断元素存在几种方式比较

    1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String containValue){ return Arrays.asList(arr).contains(containValue); } 需要注意的是Arrays.asList这个方法中转换的List并不是java.util.ArrayList而是java.util.Arrays.ArrayList,其中java.

  • 详解Java合并数组的两种实现方式

    最近在写代码时遇到了需要合并两个数组的需求,突然发现以前没用过,于是研究了一下合并数组的方式,总结如下. 1.System.arraycopy()方法 (1) 解析 通过阅读JDK源码,我可以知道方法原型如下: public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 其中: src是源数组 srcPos是源数组复制的起始位置 dest是目标数组 destP

  • Java ArrayList集合详解(Java动态数组)

    目录 一.ArrayList集合的概述和基本使用 1.概述 2.基本使用 二.ArrayList集合的详细介绍 1.定义一个ArrayList集合 2.ArrayList集合常用的方法 3.将"类"存入ArrayList集合 4.遍历ArrayList集合 5.将基本数据类型存入ArrayList集合 6.ArrayList作为方法的参数 7.ArrayList作为方法的返回值 一.ArrayList集合的概述和基本使用 1.概述 ArrayList是集合的一种实现,Collectio

  • 详解Java中一维、二维数组在内存中的结构

    前言 我们知道在Java中数组属于引用数据类型,它整个数组的数组元素既可以是基本数据类型的(如 byte \ int \ short \ long \ float \ double \ char \ boolean 这些),也可以是引用数据类型的.当它的数组元素是基本数据类型时,这个数组就是一个一维数组:当它的数组元素是引用数据类型时,它就是一个多维数组.比如,在一个数组中它的某个元素值其实是一个一维数组,而其他不同的元素也各自包含了一个一维数组,我们就把这个包含很多个一维数组的数组叫做二维数组

  • 详解java中反射机制(含数组参数)

    详解java中反射机制(含数组参数) java的反射是我一直非常喜欢的地方,因为有了这个,可以让程序的灵活性大大的增加,同时通用性也提高了很多.反射原理什么的,我就不想做过大介绍了,网上一搜,就一大把.(下面我是只附录介绍下) Reflection 是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等).superclass(例如O

  • 详解java 中Spring jsonp 跨域请求的实例

    详解java 中Spring jsonp 跨域请求的实例 jsonp介绍 JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外.利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSO

  • 详解java中this.getClass()和super.getClass()的实例

    详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. getClass()是java中Object类的一个方法,其原型为: public final Class<?> getClass() 返回值为 当前运行时类的Class对象. 所以写了一段代码来说明: getClass()不受this和super影响,而是有当前的运行类决定的. 代码如下: 父类

  • 详解 Java中日期数据类型的处理之格式转换的实例

    详解 Java中日期数据类型的处理之格式转换的实例 概要: 日期以及时间格式处理,在Java中时间格式一般会涉及到的数据类型包括Calendar类和Date类. Date类: 1.Date类型转String类型(以时间格式1970-01-01 01:01:01为例) //yyyy-MM-dd HH:mm:ss表示24时间进制 SimpleDateFormat sDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String

  • 详解Java数组的四种拷贝方式

    目录 深拷贝与浅拷贝的区别 1.for循环进行拷贝 拷贝数值类型 拷贝引用类型 2.copyof/copyOfRange 拷贝数值类型 拷贝引用类型 3.arraycopy 拷贝数值类型 拷贝引用类型 4.clone 拷贝数值类型 拷贝引用类型 5.总结 深拷贝与浅拷贝的区别 假设现在有原数组A以及拷贝后的数组B,若是改变A中的某一个值,B数组随之相应的发生变化的拷贝方式称为浅拷贝,反之B数组不受影响,则称为深拷贝:简单总结一下两者的概念: 深拷贝:拷贝后,修改原数组,不会影响到新数组: 浅拷贝

随机推荐