数组习题

第一题:
输入一个数组arr,返回数组中出现次数最多的元素和出现次数最少的元素
思路:定义一个新的数组来存放数组arr中每个元素出现的次数
再在新的数组中找出最大和最小的元素的索引即可

public void Demo01() {
		
		//随机产生数组的大小
		int [] arr = new int[(int)(Math.random()*10+6)];
		//随机给数组中的元素赋值
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int)(Math.random()*6+1);
		}
		//输出数组
		System.out.println(Arrays.toString(arr));
		
		//定义一个新的数组来存放数组arr中每个元素出现的次数
		int [] count = new int[arr.length];
		for (int i = 0; i < count.length; i++) {
			for (int j = 0; j < count.length; j++) {
				if(arr[i] == arr[j]) {
					count[i]++;
				}
			}
		}
		//输出记录出现次数的数组count
		System.out.println(Arrays.toString(count));
		//找出数组count中最大值和最小值的索引
		int maxIndex = 0;
		int minIndex= 0;
		for (int i = 1; i < count.length; i++) {
			if(count[i]>count[maxIndex]) {
				maxIndex = i;
			}
			if(count[minIndex]<count[0]) {
				minIndex = i;
			}
		}
		//输出出现次数最多和最少的数
		System.out.println("出现次数最多的数是:"+arr[maxIndex]);
		System.out.println("出现次数最少的数是:"+arr[minIndex]);
	}

第二题:
输入含有10个元素的数组,求出这10个数的最大公约数(公约数:是几个整数同时均能整除的整数)
思路:先求出两两之间的最大公因数再在这些最大公因数中求出最大的那个

public void Demo02() {
		
		//随机产生数组大小
		int [] arr = new int[(int)(Math.random()*20+1)];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int)(Math.random()*40+1);
		}
		//输出产生的数组
		System.out.println(Arrays.toString(arr));
		int maxGys = 0;//记录这10个数的最大公约数
		for (int i = 0; i < arr.length-1; i++) {
			for (int j = i+1; j < arr.length; j++) {
				int gys = 0;//记录两个数的最大公约数
				if(arr[i] == arr[j]) {
					gys = arr[j];
					//gys = arr[i];
				}else if(arr[i]>arr[j]) {
					for (int k = arr[j]; k>0 ; k--) {
						if(arr[i]%k == 0 && arr[j]%k == 0) {
							gys = k;
							break;
						}
					}
				}else {
					for (int k = arr[i]; k > 0 ; k--) {
						if(arr[i]%k == 0 && arr[j] % k == 0) {
							gys = k;
							break;
						}
					}
				}
				if(maxGys<gys) {
					maxGys = gys;
				}
			}
		}
		System.out.println("这是个数的最大公约数是:"+maxGys);
	}

第三题:
现在有如下的一个数组:
int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成新数组
思路:定义新的数组的长度为:旧数组长度-元素0的个数

public void Demo03() {
		int [] oldArr = {1,3,4,5,0,0,6,0,5,4,7,6,7,0,5};
		
		int length = 0;//记录oldArr数组中0的个数
		for (int i = 0; i < oldArr.length; i++) {
			if(oldArr[i] == 0) {
				length++;
			}
		}
		
		//定义新的数组
		int [] newArr = new int[oldArr.length-length];
		//定义oldArr数组中不为0的次数索引
		int index = 0;
		for (int i = 0; i < oldArr.length; i++) {
			if(oldArr[i] != 0) {
				newArr[index] = oldArr[i];
				index++;
			}
		}
		System.out.println("修改前的数组:"+Arrays.toString(oldArr));
		System.out.println("修改后的数组:"+Arrays.toString(newArr));
	}

第四题:
有一组随机数组,例子为:4 3 6 22 5 2
要求 4与3的和插入到6的后面,然后22与5的和插入到2后,如果5这个数后面没有2。那么依然不变,比如 原来数组为:4 3 6 22 5 2 变化后为:4 3 6 (7) 22 5 2 (27)

public void l() {
		
		//声明一个随机长度的数组
		int [] oldArr = new int[(int)(Math.random()*10+1)];
		
		//随机给数组赋值
		for (int i = 0; i < oldArr.length; i++) {
			oldArr[i] = (int)(Math.random()*20+1);
		}
		//定义一个新的数组newArr,用来存放变化后的数组
		int [] newArr = new int[oldArr.length/3+oldArr.length];//按照规则,是每三个数后面添加一个新的数,3个数为一个循环
		
		int index = 0;
		for (int i = 0; i < oldArr.length; i++) {
			
			newArr[index] = oldArr[i];
			index++;
			
			if((i+1)%3 == 0) {
				newArr[index] = oldArr[i-1]+oldArr[i-2];
				index++;
			}
		}
		System.out.println("旧数组:"+Arrays.toString(oldArr));
		System.out.println("新数组:"+Arrays.toString(newArr));
	}
	
	//把第一个数和第二个数的和插在第三个位置上,如下:
	4    3    6     22    5    2 
	4    3   (7)   6     22    5     (27) 2   
	public void l2() {
		// 声明一个int类型的数组,长度随机
		int[] oldArr = new int[(int) (Math.random() * 10 + 1)];
		// 通过随机数给数组赋值
		for (int i = 0; i < oldArr.length; i++) {
			oldArr[i] = (int) (Math.random() * 20 + 1);
		}
		// 新数组长度为旧数组扩容50%
		int[] newArr = new int[oldArr.length/2+oldArr.length];
		int index = 0;
		for (int i = 0; i < newArr.length; i++) {
		// 每三个一组,当遇到第三个时,下标加一
		if((i+1)%3==0){
			index++;
	 	    // 第三个数是第一个数和第二个数之和
			newArr[i] = newArr[i-1]+newArr[i-2];
		}else{
			newArr[i] = oldArr[i-index];
			}
		}
		System.out.println("旧数组:"+Arrays.toString(oldArr));
		System.out.println("新数组:"+Arrays.toString(newArr));
	}

第五题:
有一篇文章,共10行,每行有80个字符。编写程序,统计其中大写字母、小写字母、数字、空格及其它字符各有多少个。(二维数组)
思路:定义一个新的数组,用来存放小写、大写、数字、其他字符的出现的次数

public void Demo05() {
		
		//定义一个二维数组
		char [][] chr = new char[10][80];
		//随给二维数组赋值
		for (int i = 0; i < chr.length; i++) {
			for (int j = 0; j < chr[i].length; j++) {
				chr[i][j] = (char)((int)(Math.random()*80+48));
			}
		}
		
		//定义一个数组,按照小写、大写、数字、其他的顺序存入个数
		int [] num = new int[4];
		for (int i = 0; i < chr.length; i++) {
			for (int j = 0; j < chr[i].length; j++) {
				char c = chr[i][j];
				if(c>='a' && c<='z') {
					num[0]++;
				}else if(c>='A' && c<='Z') {
					num[1]++;
				}else if(c>='0' && c<='9') {
					num[2]++;
				}else {
					num[3]++;
				}
			}
		}
		System.out.println(Arrays.toString(num));
	}

第六题:
某单位用现金发放工资,编写程序计算各种面值的最佳张数, 以保证发给职工工资时不需找零。职工工资与各种面值的张数均要求用数组描述。
思路:定义一个数组,用来存放面值100、50、20、10、5、1的数量

public void Demo06() {
		
		System.out.println("请输入工资:");
		int money = scan.nextInt();
		//定义一个数组来存放100、50、20、10、5、1面值的数量
		int [] num = new int[6];
		
		if(money >= 100) {
			num[0] = money/100;
			money = money%100;
		}
		if(money >= 50){
			num[1] = money/50;
			money = money%50;
		}
		if(money >= 20) {
			num[2] = money/20;
			money = money%20;
		}
		if(money >= 10) {
			num[3] = money/10;
			money = money%10;
		}
		if(money >= 5) {
			num[4] = money/5;
			money = money%5;
		}
		if(money >= 1){
			num[5] = money;
		}
		
		//输出数组num
		System.out.println(Arrays.toString(num));
	}

数组扩容问题

public void q() {
		int [] oldArr = new int[(int)(Math.random()*10)];
		// 创建一个新数组,新数组长度为老数组长度+1
		int [] newArr = new int[oldArr.length+1];
		for (int i = 0; i < oldArr.length; i++) {
			newArr[i] = oldArr[i];
		}
		System.out.println(Arrays.toString(oldArr));
		System.out.println(Arrays.toString(newArr));
	}
	
//将一个正整数分解质因数。例如:输入78,打印出2*3*13
	public void f() {
		System.out.println("请输入一个数:");
		int num = scan.nextInt();
		for (int i =2; i < num/2; i++) {
			if(num % i == 0) {
				num = num/i;
				System.out.print(i+"*");
				i = 1;
			}
		}
		System.out.println(num);
	}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值