Java 数组相关的一些算法笔试题

多维数组的使用:

练习1:
在这里插入图片描述

package com.atguigu.exer;

public class ArrayExer1 {
	public static void main(String[] args) {
		//具体问题具体分析,静态初始化只需一行搞定
		int[][] arr =new int[][]{{3,5,8},{12,9},{7,0,6,4}};
		int sum=0; //记录总和
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr[i].length;j++){
				sum+=arr[i][j];
			}
		}
		System.out.println("总和为"+sum);  //54
}
}

练习2:
在这里插入图片描述

注意有坑( int[ ] x,y[ ]; ):
int[ ] x,y[ ]; 相当于:int[ ] x;int[ ] y[ ];
所以x为一维数组,y为二维数组。

练习3:

打印杨辉三角

package com.atguigu.exer;

public class YangHuiTest {
	public static void main(String[] args) {
		//1,声明并初始化二维数组(动态初始化)
		int[][] yangHui=new int[10][]; //后面的[]内不写值,因为每列元素个数都不一样
		//2,给数组元素赋值
		for(int i=0;i<yangHui.length;i++){
			yangHui[i]=new int[i+1];  //表示第一行只有  一个元素(int[1]数组长度为一)
			
			//2.1给首末元素赋值
			yangHui[i][0]=1;
			yangHui[i][i]=1;
			//2.2给每行的非首末元素赋值
			if(i>=2){ //if去掉依然成立,i=0,i=1进不去循环
				for(int j=1;j<yangHui[i].length-1;j++){  //范围从第二个元素开始到倒数第二个元素结束
				yangHui[i][j]=yangHui[i-1][j-1]+yangHui[i-1][j];
				}
			}
		}
		//3,遍历二维数组
		for(int i=0;i<yangHui.length;i++){
			for(int j=0;j<yangHui[i].length;j++){
				System.out.print(yangHui[i][j]+" ");
			}
			System.out.println();
		}
	}
}


在这里插入图片描述在这里插入图片描述
红色标注为面试常考题型:

面试题:

在这里插入图片描述

/*面试题目:创建一个长度为6的int型数组,要求取值为1-30,同时元素值各不相同*/
package com.atguigu.exer;

public class ArrayRan {
	public static void main(String[] args) {
	  int[] arr=new int[6];
	  for(int i=0;i<arr.length;i++){
		arr[i]=(int) (Math.random()*30)+1; //赋值
		
		boolean flag=false;  //标志
		while(true){
			//i=0时不进入循环,第一个数不用怕和前面重复
			for(int j=0;j<i;j++){  
				if(arr[i]==arr[j]){  
					flag=true;
					break;  //for循环出口
				}
			}
			if(flag){
				arr[i]=(int) (Math.random()*30)+1;
				flag=false; //重置,用于下次循环
				continue;   //结束当次while循环
			}
			break;  //while循环出口,执行此句表明后面赋值与前面不相等
		}
	  }
	  for(int i=0;i<arr.length;i++){
		  System.out.println(arr[i]);
	  }
	}
	

}

补充知识——如何获取一个1-30的随机整数

 Math.random()取值[0.0,1.0);
注意此处乘以30范围变为[0.0,30.0)
再加一,范围变为[1.0,31.0),
 arr[i]=(int) (Math.random()*30)+1; 
 进行强制类型转换刚好转为1-30的整数。


在这里插入图片描述

/* 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
要求:所有随机数都是两位数。*/
package com.atguigu.exer;

public class ArrayNumber {
	public static void main(String[] args) {
		//定义数组
		int[] arr=new int[10];
		//赋值
		for(int i=0;i<arr.length;i++){
			arr[i]=(int)(Math.random()*90+10);
		}
		//遍历输出,看一下生成的随机数
		for(int i=0;i<arr.length;i++){
			System.out.println(arr[i]);
		}
		//求最大值
		int maxValue=arr[0]; //若使maxValue=0有负数时会出错
		for(int i=0;i<arr.length;i++){
			if(arr[i]>maxValue){
				maxValue=arr[i];
			}
		}
		System.out.println("最大值为:"+maxValue);
		//求最小值
		int minValue=arr[0];
		for(int i=0;i<arr.length;i++){
			if(arr[i]<minValue){
				minValue=arr[i];
			}
		}
		System.out.println("最小值为:"+minValue);
		//求和值
		int sum=0;  //此处可以赋值为0,求和,有负数也不会出错
		for(int i=0;i<arr.length;i++){
			sum+=arr[i];
		}
		System.out.println("总和为:"+sum);
		//求平均值
		double avgValue=sum/arr.length;  
		System.out.println("均值为:"+avgValue);
		
		
	}
}

在这里插入图片描述

在这里插入图片描述

package com.atguigu.exer;
//)创建一个名为ArrayTest的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组
public class ArrayTest {
	public static void main(String[] args) {
		int[] array1,array2;
		//使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
		array1=new int[]{2,3,5,7,11,13,17,19};
		//显示array1的内容。
		for(int i=0;i<array1.length;i++){
			System.out.print(array1[i]+"\t"); //输出在一行内以空格隔开
		}
		//赋值
		array2=array1;
		//修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。
		for(int i=0;i<array2.length;i=i+2){
			if(i%2==0){
				array2[i]=i;
			}
		}
		System.out.println(); //换行
		//打印出array1。
		for(int i=0;i<array1.length;i++){
			System.out.print(array1[i]+"\t");
		}
}
}

运行结果:
在这里插入图片描述修改array2后array1发生了变化。原因如下:
在这里插入图片描述
其中 array2=array1; 不能称之为数组的复制,它类似给计算机中一个文件创建了一个快捷方式。
array1和array2地址值相同,都指向堆空间中唯一一个数组实体。
思考如何实现array2对array1数组的复制

如下才是真正的复制操作:

package com.atguigu.exer;
public class ArrayTest1 {
	public static void main(String[] args) {
		int[] array1,array2;
		array1=new int[]{2,3,5,7,11,13,17,19};
		for(int i=0;i<array1.length;i++){
			System.out.print(array1[i]+"\t"); 
		}
		//这才是数组的复制
		array2=new int[array1.length];
		for(int i=0;i<array2.length;i++){
			array2[i]=array1[i];
		}
		for(int i=0;i<array2.length;i=i+2){
			if(i%2==0){
				array2[i]=i;
			}
		}
		System.out.println(); 
		for(int i=0;i<array1.length;i++){
			System.out.print(array1[i]+"\t");
		}
}
}

在这里插入图片描述

算法的考察

数组的复制、反转、查找(线性查找、二分法查找)

//数组的复制、反转、查找(线性查找、二分法查找)
package com.atguigu.exer;
public class Arraytestpro {
	public static void main(String[] args) {
		String[] arr=new String[]{"jd","dj","mm","gg","AA","Bb"};
		//数组的复制(区别于arr1=arr2)
		String[] arr1=new String[arr.length];
		for(int i=0;i<arr.length;i++){
			arr1[i]=arr[i];
			System.out.print(arr1[i]+"\t");
		}
		System.out.println();
		
		//数组的反转
		//方法一:
//		for(int i=0;i<arr.length/2;i++){    //注意循环条件,6个数到索引为2结束即可完成反转,若不除2相当于反转两次又复原了
//			String temp=arr[i];  //定义中间变量
//			arr[i]=arr[arr.length-i-1];
//			arr[arr.length-i-1]=temp;
//		}
		//方法二:
		for(int i=0,j=arr.length-1;i<j;i++,j--){ //i=j时不用操作(自己跟自己换没意思)
			String temp=arr[i];
			arr[i]=arr[j];
			arr[j]=temp;
		}
		for(int i=0;i<arr.length;i++){ //遍历
			System.out.print(arr[i]+"\t");
		}
		System.out.println();
		
		//数组的查找(搜索)
		//1,线性查找
		boolean isFlag=true;  //技巧:引入标志
		String dest="Bb";
		for(int i=0;i<arr.length;i++){
			if(dest.equals(arr[i])){   //字符串不可以用==,使用equals---比较内容是否相等
				System.out.println("找到了,位置为:"+i);
				isFlag=false;
				break;
			}
		}
		if(isFlag){
			System.out.println("找不到哦");	
		}
		//,二分法查找(折半查找)   前提:所要查找的数组必须有序
		int[] arr2=new int[]{-98,-34,2,34,54,66,79,105,210,333};
		int dest1=34;
		int head=0; //初始的首索引
		int end=arr2.length-1; //初始的尾索引
		boolean isFloat1=true;
		while(head<=end){  //条件不满足,结束循环
			int middle=(head+end)/2;
			if(dest1==arr2[middle]){
				System.out.println("找到了指定元素,位置为:"+middle);
				isFloat1=false;
				break;  //找到元素,结束循环
			}else if(arr2[middle]>dest1){
				end=middle-1;
			}else{  //arr2[middle]>dest1
				head=middle+1;
			}
		}
		
		if(isFloat1){  //没有找到
			System.out.println("找不到哦");
		}
		
	}

}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

过期动态

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

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

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

打赏作者

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

抵扣说明:

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

余额充值