前言
与牛客的相知相遇:
一次偶然的机会我接触到了牛客网,从那次我就发现牛客网好像是一个全能型的网站,里面有各种语言的练习题、算法题、大厂的面试题、还有求职等各项功能。从那以后我就开始了我的牛客之旅。
链接我就放在这了需要的伙伴们自取👉注册即可免费刷题
一、数组元素的赋值(曾经的面试题)
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.运行截图
自己从键盘上输入要查找的值,如果在这个数组中会显示在第几位,不在则提示您没有找到。