数组的概念
是由多个相同类型的元素按照一定的顺序排列的数据集合,可以通过整数下标访问数组中的值。例如a是一个整数类型的数组,a[i]就是数组下标为i的整数。
数组的定义
数组在声明的时候必须指定其类型和数组名称,数组初始化有两种即静态初始化、动态初始化。下面声明了一个int类型静态初始化的数组。
int[] a = {1,2,3,4,5,6};
亦可以像下面动态初始化长度为10的int类型数组。
int[] arr = new int[10];
当arr
数组被创建的时候,所有的元素默认初始化为0,如果是boolean
数组默认为false而对象数组元素则初始化为null。需要注意的是:数组本身是引用数据类型,数组元素即可以是基本数据类型也可是引用数据类型。如下声明了一个引用数据类型的数组。
String[] args = new String[10];
特别注意的是,当试图访问args[10]数组元素时将会引发Array index out of bounds
的异常。数组创建的时候将会在内存中开辟一个连续的空间,所以我们可以通过索引访问数组元素,而且数组创建完毕后,其长度也不能被改变。
数组的内存分析
int[] arr = new int[4];
arr[0]=1;
arr[1]=2;
arr[2]=3;
arr[3]=4;
数组内存分析如下图所示;
数组面试题
- 华夏花城短租半年,780元/每月,有空调、有网络、独立卫生间,厨房齐全。屋内均为IT人士,所以要求来租者最好是刚毕业的年轻人。
public static void main(String[] args) {
int[] arr = {8, 2, 1, 0, 3};
int[] index = {2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3};
String telephone = "";
for (int i = 0; i < index.length; i++) {
telephone += arr[index[i]];
}
System.out.println("联系方式:" + telephone);
}
- 请用scanner类输入5个学生的成绩并输出最大的学生的成绩
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学生个数");
int num = scanner.nextInt();
System.out.println("请输入学生成绩");
int[] arr = new int[num];
for (int i = 0; i < arr.length; i++) {
arr[i] = scanner.nextInt();
}
// 获取最大值
int max = 0;
for (int i = 0; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
}
System.out.println("学生最大成绩为:" + max);
}
- 请输出99乘法表
public static void main(String[] args) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(i + "*" + j + "=" + i * j+" "); } System.out.println(); } }
- 请输出1-100以内的质数。
public static void main(String[] args) {
// 输出1到100以内的质数(除了能被1和本身进行整除)
for (int i = 2; i < 101; i++) {
boolean flag = false;
for (int j = 2; j < i; j++) {
// 即能被整除
if (i % j == 0) {
flag = true;
}
}
// 如果是质数:内循环的第一个if判断将会执行,flag为true
if (flag) {
System.out.println(i);
}
}
}
}
- 任意输出两个数,并求其最大公约数和最小公倍数,提示最大公约数与最小公倍数的乘积即为两个数之积。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入两个数");
int m = scanner.nextInt();
int n = scanner.nextInt();
int i = getNum(m, n);
int j = getNumSub(m, n);
System.out.println("最小公约数为:" + i + "最大公倍数为:" + m * n / i);
System.out.println("最小公约数为:" + j + "最大公倍数为:" + m * n / j);
}
/**
* 思路:先获取两个数最大的,判断两个数分别相除从最大数开始每次递减的数组
* 若能出现刚刚好能被第一个数整除即为最大公约数
*/
public static int getNum(int m, int n) {
int max = m > n ? m : n;
int num = 1;
for (int i = max; i > 0; i--) {
if (m % i == 0 && n % i == 0) {
num = i;
break;
}
}
return num;
}
/**
输入两整数m和n(m>=n)
1)m%n 得出余数,
2)若余数为0,则 n 即为两数的最大公约数
3)若余数不为0,则 m=n,n=余数,再执行第1步。
*/
public static int getNumSub(int m, int n) {
if (m < n) {
int temp = n;
n = m;
m = temp;
}
if (m % n != 0) {
return getNum(n, m % n);
}
return 1;
}
- 请写出冒泡程序和选择程序
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数组长度");
int i = scanner.nextInt();
int[] arr = new int[i];
for (int j = 0; j < arr.length; j++) {
int random = (int) (Math.random() * 100);
arr[j] = random;
}
System.out.println("生成的数组:" + Arrays.toString(arr));
chooseSort(arr);
bubbleSort(arr);
}
public static void chooseSort(int[] arr) {
// 选择排序,每一次可以确保最大的在最后面
for (int j = 0; j < arr.length; j++) {
for (int k = j + 1; k < arr.length; k++) {
if (arr[j] > arr[k]) {
int temp = arr[j];
arr[j] = arr[k];
arr[k] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
/** 冒泡排序
* 外层循环控制循环次数
* 内层循环实际进行比较
*/
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
目前遇到的数组面试题大概就是这么多,后面遇到还会继续更新。