数组使用的核心思想

数组使用的核心思想:

数组特点:1.固定长度 2. 元素都有索引

什么时候使用数组(容器)呢?

数据多了,必须先进行存储,然后进行操作。

对于数组容器什么时候用呢?

数据多个数确定,而且有对应关系


在分析需求时:
1.需求中的数据是否有对应的有序编号
2.需求中的数据是否需要有序的编号
如果有,就用数组存储。


例1:一组数: 34,89,12,70,45 要对他们进行操作,需要编号,操作更容易。

另一组数: 100,101,102,103 就不需要编号


例2: 根据用户输入的数据,显示对应的星期   用 switch,if 方法什么的不说了。。
思路:
1.星期有多个,个数固定
2.星期都由对应的有序编号
所以可以使用数组这种结构进行存储

定义一个功能,根据给定的数据获取对应的星期。
(重点是思想
(代码什马的都不重要)

查表法:数据之间存在对应的关系通过关系中的一方查询另一方。
当对应关系存在,但没有一方是有序编号时,使用另一个容器,map


public static String getWeek(int num){

	if(num>7||num<1)
		return num+"没有对应的星期";

	//1.定义一个数组,存储对应的星期数,这个称之为存储了一个对应关系的表。
	String[] weeks = {"","星期一","星期二","星期三","星期四","星期五","星期六","星期日"}; 
	//根据指定的索引查表

	return weeks[num]
}

配上个图(一维数组的内存图解):

数组定义的图解:


给数组赋值时的内存图解:

注:sop是System.out.println的意思。


改变数组的地址指向的图解:

因为数组是引用型数据类型,所以arr,xxx中存储的实际上是堆内存中数组实体的地址,当arr=xxx时,arr就不会指向0x0023而是指向0x0078,所以0x0023处的数组实体就成为了垃圾,JAVA中的垃圾回收机制会不定时的处理这些堆内存中的垃圾,防止内存溢出。



练习题:

1.

对一个给定的数组进行翻转
{23,14,88,5}-->
{5,88,14,23}

class Demo
{
	public static void main(String args[]){
		int [] = {23,14,88,5};
		for(int start=0,end = arr.length-1;start < end;start++,end--){
			swap(arr,start,end);
		}
	}
	public static void swap(int [] arr,int a,int b){
		arr[a] = arr[a] ^ arr[b];
		arr[b] = arr[a] ^ arr[b];
		arr[a] = arr[a] ^ arr[b];
	}
}

2.

/*
思考题:
需求:如果往有序的数组中插入一个元素并继续保证有序,如何获取该位置?
思路:
1.既然是有序的数组,而且是找位置,必须要想到<span style="color:#ff0000;">二分查找法</span>
*/
import java.util.Arrays;
class Demo
{
	public static void main(String args[]){
		int[] arr = {9,13,25,29,45,46,88,99};

		int index = binarySearch2(arr,7);
		//int index2 = Arrays.binarySearch(arr,7); 
		//JAVA自带的二分查找方法,若存在该数,则返回角标
		//不存在则返回一个负数,该负数取正再减1就是插入点
		System.out.println("index="+index);
		//System.out.println("index2="+index);
	}
	public static int binarySearch2(int[] arr,int key){
		//1.定义三个变量,记录头角标,尾角标,中间角标
		int max,min,mid;
		min = 0;
		max = arr.length-1;
		
		while(min<=max){
			mid = (max+min)>>1;
			
			if(key>arr[mid])
				min = mid + 1;
			else if(key<arr[mid])
				max = mid - 1;
			else
				return mid;
		}
		return min;
	}
}

获取插入点后剩余的部分就好处理了,这里就不多讲了,重新定义一个数组(比原数组长度多一),插入点之前的原样插入,插入点处插入要求的数据,后面的数据顺延即可。

又到了凌晨,╮(╯▽╰)╭唉,悲催的程序猿...

看会奥运会吧 得意得意得意得意得意得意得意





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值