笔试题
参考答案:1.D 2.D 3.C 4.C 5.B 6.C 7.B
机试题
练习1
从控制台读取5个整数,将这5个数升序排序后输出
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] nums = new int[5];
for (int i = 0; i < 5; i++) {
System.out.println("请输入数字:");
nums[i] = scanner.nextInt();
}
//冒泡排序
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] < nums[j]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
//System.out.println(Arrays.toString(nums));//输出
for (int i = 0; i < nums.length; i++) {//或循环遍历输出
System.out.println(nums[i]);
}
}
练习2
从控制台读取5个整数,将这5个数降序排序后输出
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] nums = new int[5];
for (int i = 0; i < 5; i++) {
System.out.println("请输入数字:");
nums[i] = scanner.nextInt();
}
//冒泡排序
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
//System.out.println(Arrays.toString(nums));//输出
for (int i = 0; i < nums.length; i++) {//或循环遍历输出
System.out.println(nums[i]);
}
}
练习3
定义一个长度为5的一维数组,数组中元素的值分别为1~5,输出如下结果:
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
for (int i = 0; i < nums.length; i++) {
for (int j = i; j < nums.length; j++) {
System.out.print(nums[j] + "\t");
}
for (int j = 0; j < i; j++) {
System.out.print(nums[j] + "\t");
}
System.out.println();
}
}
练习4
设计一个5x5的数组,使用for循环赋值,结果如下:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
public static void main(String[] args) {
int[][] nums = new int[5][5];
int n = 1;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
nums[i][j] = n;
n++;
}
}
for (int i = 0; i < nums.length; i++) {//输出
System.out.println(Arrays.toString(nums[i]));
}
}
练习5
设计一个5x5的数组,使用for循环赋值,结果如下:
1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
public static void main(String[] args) {
int[][] nums = new int[5][5];
int n = 1;
for (int i = 0; i < nums.length; i++) {
if (i % 2 == 0) {
for (int j = 0; j < nums[i].length; j++) {
nums[i][j] = n;
n++;
}
} else {
for (int j = nums[i].length - 1; j >= 0; j--) {
nums[i][j] = n;
n++;
}
}
}
for (int i = 0; i < nums.length; i++) {//输出
System.out.println(Arrays.toString(nums[i]));
}
}
练习6
设计一个5x5的数组,使用for循环赋值,结果如下:
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
public static void main(String[] args) {
int[][] nums = new int[5][5];
int n = 1;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
nums[j][i] = n;
n++;
}
}
for (int i = 0; i < nums.length; i++) {//输出
System.out.println(Arrays.toString(nums[i]));
}
}
练习7
设计一个5x5的数组,使用for循环赋值,结果如下:
1 10 11 20 21
2 9 12 19 22
3 8 13 18 23
4 7 14 17 24
5 6 15 16 25
public static void main(String[] args) {
int[][] nums = new int[5][5];
int n = 1;
for (int i = 0; i < nums.length; i++) {
if (i % 2 == 0) {
for (int j = 0; j < nums[i].length; j++) {
nums[j][i] = n;
n++;
}
} else {
for (int j = nums[i].length - 1; j >= 0; j--) {
nums[j][i] = n;
n++;
}
}
}
for (int i = 0; i < nums.length; i++) {//输出
System.out.println(Arrays.toString(nums[i]));
}
}
练习8
创建一个n*n的数组,完成如下赋值,称作回型矩阵。
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
解题思路
public static void main(String[] args) {
int len = 5;//行列数
int[][] nums = new int[len][len];
int n = 1;
int circle = 1;//第几圈
while (n < len * len) {
//右
for (int i = circle - 1; i < len - circle; i++) {
nums[circle - 1][i] = n++;
}
//下
for (int i = circle - 1; i < len - circle; i++) {
nums[i][len - circle] = n++;
}
//左
for (int i = len - circle; i >= circle; i--) {
nums[len - circle][i] = n++;
}
//上
for (int i = len - circle; i >= circle; i--) {
nums[i][circle - 1] = n++;
}
circle++;
}
if (len % 2 == 1) {//奇数的时候中间那个需要单独设置
nums[len / 2][len / 2] = len * len;
}
for (int i = 0; i < nums.length; i++) {//输出
System.out.println(Arrays.toString(nums[i]));
}
}
练习9
有一个正整数数组,存在重复元素,非降序排列。要求将数组元素打印到屏幕上,请手写程序,并满足一下条件:
- 按升序输出数组元素
- 重复元素仅打印一次
- 时间复杂度O(n)
示例:原始数据[2,3,3,6,6,9,10,10,10,16,18],依次在屏幕上打印 2,3,6,9,10,16,18
public static void main(String[] args) {
int[] nums = {2, 3, 3, 6, 6, 9, 10, 10, 10, 16, 18};
System.out.println(nums[0]);
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[i - 1]) {//相邻的两个数不相等
System.out.println(nums[i]);
}
}
}
练习10
有一个数组中有100个数字,请输出:没有重复并按照升序排序的数字
public static void main(String[] args) {
int[] nums = {5, 86, 68, 24, 73, 85, 44, 91, 44, 83, 96, 32, 77, 1, 2,
32, 6, 95, 13, 94, 35, 63, 26, 54, 32, 52, 9, 51, 79, 31, 36,
76, 16, 13, 34, 72, 86, 47, 54, 52, 83, 59, 75, 13, 13, 68, 68,
51, 27, 86, 73, 12, 91, 75, 32, 54, 37, 34, 18, 65, 46, 6, 19,
33, 96, 19, 57, 9, 61, 74, 69, 8, 79, 39, 40, 1, 39, 69, 56, 58,
35, 13, 84, 13, 74, 3, 98, 52, 55, 29, 24, 67, 29, 10, 66, 72, 5, 48, 37, 67};
for (int i = 0; i < nums.length; i++) {//冒泡排序
for (int j = 0; j < nums.length - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j + 1];
nums[j + 1] = nums[j];
nums[j] = temp;
}
}
}
System.out.println(nums[0]);
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[i - 1]) {//相邻的两个数不相等
System.out.println(nums[i]);
}
}
}
练习11
给出给出随机的100个数,序号为1-100,按从小到大顺序输出,并输出相应的序号(在原数组中的位置)
public static void main(String[] args) {
int[] nums = {5, 86, 68, 24, 73, 85, 44, 91, 44, 83, 96, 32, 77, 1, 2,
32, 6, 95, 13, 94, 35, 63, 26, 54, 32, 52, 9, 51, 79, 31, 36,
76, 16, 13, 34, 72, 86, 47, 54, 52, 83, 59, 75, 13, 13, 68, 68,
51, 27, 86, 73, 12, 91, 75, 32, 54, 37, 34, 18, 65, 46, 6, 19,
33, 96, 19, 57, 9, 61, 74, 69, 8, 79, 39, 40, 1, 39, 69, 56, 58,
35, 13, 84, 13, 74, 3, 98, 52, 55, 29, 24, 67, 29, 10, 66, 72, 5, 48, 37, 67};
int[] orders = new int[nums.length];//写一个数组,记录编号从1~100,与原来的数组对应
for (int i = 0; i < nums.length; i++) {
orders[i] = i + 1;
}
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums.length - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
temp = orders[j];
orders[j] = orders[j + 1];
orders[j + 1] = temp;
}
}
}
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i] + "序号" + orders[i]);
}
}
练习12
给定一整数序列A1,A2,…An(可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大,并输出子序列的内容
//暴力破解法
int[] nums = {1, 2, -1, 6};
int step = 1;//几个元素相加
int start = 0;//开始索引
int end = 0;//结尾索引
int maxSum = nums[0];//第一次的序列只有一个数,假设当前第一个最大
while (step <= nums.length) {
for (int i = 0; i <= nums.length - step; i++) {
int tempSum = nums[i];
for (int j = i + 1; j < i + step; j++) {
tempSum += nums[j];
}
if (tempSum >= maxSum) {//和相同则要最长子序列
start = i;
end = i + step - 1;
maxSum = tempSum;
}
}
step++;
}
System.out.println(maxSum + ";start=" + start + ",end=" + end);
//动态规划法
int[] nums = {-1, -2, -1, 6,1,-10};
int max = nums[0];
//以第n个元素结尾的子序列
int[] sums = new int[nums.length];
sums[0] = nums[0];
//以第i个元素结尾的子序列和
int[] starts = new int[nums.length];
int end = 0;
for (int i = 1; i < nums.length; i++) {
if (sums[i - 1] > 0) {//它前面的子序列大于0
sums[i] = sums[i - 1] + nums[i];
starts[i] = starts[i - 1];
} else {
sums[i] = nums[i];
starts[i] = i;
}
if (sums[i] > max) {
max = sums[i];
end = i;
}
}
System.out.println(max);
System.out.println(starts[end] + "," + end);
练习13
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变
public static void main(String[] args) {
int[] nums = {1, 4, 3, 6, 7, 8, 9, 2, 3, 5, 6, 3, 0, 1};
for (int i = 0; i < nums.length; i++) {
if (nums[i] % 2 == 0) {//偶数a
for (int j = i + 1; j < nums.length; j++) {//从它后面开始找奇数
if (nums[j] % 2 == 1) {//找到它后面第一个奇数b
int temp = nums[j];//记住这个奇数b,这个奇数b要放到前面去
for (; j > i; j--) {//奇数b前面的数依次向后移动
nums[j] = nums[j - 1];
}
nums[i] = temp;//把奇数b放到原来偶数a那个位置
System.out.println(Arrays.toString(nums));
break;
}
}
}
}
System.out.println(Arrays.toString(nums));
}
练习14
有一个长度为11的array,存储1-10的数字,只有一个是重复的,请写程序找出这个数字
public static void main(String[] args) {
int num[] = {9, 4, 3, 8, 3, 1, 7, 5, 6, 10, 2};
int[] sort = new int[10];
for (int i : num) {//桶排序的思想 位置0存1,位置1存2。。位置i-1存i
if (sort[i - 1] == i) {//如果这个位置已经有数字了,代表之前放过数
System.out.println(i + "是重复的");
} else {
sort[i - 1] = i;
}
}
}