用打一把王者的时间学会了Java数组中涉及到的算法及面试题目

前言

  与牛客的相知相遇:

一次偶然的机会我接触到了牛客网,从那次我就发现牛客网好像是一个全能型的网站,里面有各种语言的练习题、算法题、大厂的面试题、还有求职等各项功能。从那以后我就开始了我的牛客之旅。

链接我就放在这了需要的伙伴们自取👉注册即可免费刷题

一、数组元素的赋值(曾经的面试题)

1.回型数

1.要求

从键盘输入一个整数(1~20) 

则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如: 输入数字2,则程序输出:

1 2 

4 3 

输入数字3,则程序输出: 

1 2 3 

8 9 4 

7 6 5 

输入数字4, 则程序输出: 

1   2      3   4 

12  13  14  5 

11  16  15  6 

10   9   8    7

2.设计思路

使用一个二维数组,对二维数组进行赋值,然后对这个二维数组中的值进行打印输出。

具体使用了k的4个取值,当k=1时,数组向右进行逐一赋值,k=2时,对数组进行向下赋值,

k=3时,对数组向左进行赋值,当k=4时,对数组向上赋值,然后进行循环赋值即可。

3.代码实现

public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("输入一个数字:");
        int len = scanner.nextInt();

        int[][] arr = new int[len][len];
        int s = len * len;
        int i = 0, j = 0, k = 1;
        for (int m = 1; m <= s; m++) {
            if (k == 1) {
                if (j < len && arr[i][j] == 0) {
                    arr[i][j++] = m;
                } else {
                    k = 2;
                    j--;
                    m--;
                    i++;
                }
            } else if (k == 2) {
                if (i < len && arr[i][j] == 0) {
                    arr[i++][j] = m;
                } else {
                    k = 3;
                    i--;
                    m--;
                    j--;

                }
            } else if (k == 3) {
                if (j >= 0 && arr[i][j] == 0) {
                    arr[i][j--] = m;
                } else {
                    k = 4;
                    m--;
                    j++;
                    i--;
                }

            } else if (k == 4) {
                if (i >= 0 && arr[i][j] == 0) {
                    arr[i--][j] = m;
                } else {
                    k = 1;
                    i++;
                    m--;
                    j++;
                }
            }

        }
        for (int l = 0; l < arr.length; l++) {
            for (int m = 0; m < arr[l].length; m++) {
                System.out.print(arr[l][m] + "\t");

            }
            System.out.println();
        }
    }

4.运行截图

 2.元素赋值

1.题目要求

创建一个长度为6的int型数组,要求取值为1-30,同时元素值各不相同。

2.设计思路

使用Mathod.random()获取随机数,但是要控制好所获取数的范围,再使用if进行判断数组中的各个元素是否相同。

3.代码实现

class ArrayExer {
	public static void main(String[] args) {
		//方式一:
//		int[] arr = new int[6];
//		for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)
//			arr[i] = (int) (Math.random() * 30) + 1;
//
//			boolean flag = false;
//			while (true) {
//				for (int j = 0; j < i; j++) {
//					if (arr[i] == arr[j]) {
//						flag = true;
//						break;
//					}
//				}
//				if (flag) {
//					arr[i] = (int) (Math.random() * 30) + 1;
//					flag = false;
//					continue;
//				}
//				break;
//			}
//		}
//
//		for (int i = 0; i < arr.length; i++) {
//			System.out.println(arr[i]);
//		}
		//方式二:
		int[] arr = new int[6];
		for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)
			arr[i] = (int) (Math.random() * 30) + 1;
			
				for (int j = 0; j < i; j++) {
					if (arr[i] == arr[j]) {
						i--;
						break;
					}
				}
			}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}

4.运行截图

二、二分法

1.二分查找的介绍

二分查找是给定一堆数,让你从这堆数中去查找某个值,看这个值是否存在。

2.二分查找的思想

假定元素序列已经由小到大排好序,将有序序列分成规模大致相等的两部分,然后取中间元素与特定查找元素x进行比较,如果x等于中间元素,则算法终止;如果x小于中间元素,则在序列的左半部继续查找,即在序列的左半部重复分解和治理操作;否则,在序列的右半部继续查找,即在序列的右半部重复分解和治理操作。可见,二分查找算法重复利用了元素间的次序关系。

3.构造实例

4.代码实现 

 public static void main(String[] args) {

        //二分查找
        int[] arr = new int[]{98, 30, -20, 34, 54, -5, 79, 15, 10, -33};
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = 0;
                    temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }

        }
        System.out.print("数组的值:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");

        }
        System.out.println();
        System.out.println("请输入要查找的数:");
        Scanner scanner = new Scanner(System.in);
        int key = scanner.nextInt();
        int low = 0;
        int high = arr.length - 1;
        boolean isFlag = true;
        while (low <= high) {
            int middle = (low + high) / 2;
            if (key == arr[middle]) {
                System.out.println("找到了指定的元素,位置为:" + (middle + 1));
                isFlag = false;
                break;
            } else if (arr[middle] > key) {
                high = middle - 1;
            } else {
                low = middle + 1;
            }
        }
        if (isFlag) {
            System.out.println("很遗憾,结果没有找到");
        }
    }

5.运行截图

 

 自己从键盘上输入要查找的值,如果在这个数组中会显示在第几位,不在则提示您没有找到。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

敲代码的小王!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值