java 数组练习题
时间: 2024-05-27 21:06:00 浏览: 121
Java 数组练习题可以有很多,下面是一些常见的例子:
1. 给定一个整数数组,找出其中两个数的和等于目标值,返回这两个数的索引。例如,给定 nums = [2, 7, 11, 15], target = 9,因为 nums + nums = 2 + 7 = 9,所以返回 [0, 1]。
2. 给定一个整数数组,找出其中最长的连续递增序列的长度。例如,给定 nums = [1,3,5,4,7],最长连续递增序列是 [1,3,5],所以返回它的长度 3。
3. 给定一个二维数组 matrix,按照顺时针螺旋顺序返回它的所有元素。例如,给定以下矩阵 matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
应该返回 [1,2,3,6,9,8,7,4,5]。
相关问题
java数组练习题
<think>好的,我现在需要处理用户关于Java数组练习题的需求。用户希望得到示例、代码、题目和解析,所以我得先整理相关的资源。首先,看看用户提供的引用内容,引用3提到了数组逆序、插入、杨辉三角、顺序查找、二分查找、数组交集和寻找缺失数字等经典题目。引用4则是一个动态数组练习题,关于合并两个有序数组。用户可能对这类题目感兴趣,需要结合这些内容来生成问题。
接下来,我需要确保回答的结构清晰,符合用户的要求,包括示例代码和解析。可能还需要补充一些常见的数组练习题,比如数组去重、旋转数组、子数组和等,这样内容会更全面。同时,要注意每个题目都要有示例代码和解析,帮助用户理解。
还要检查代码的正确性,比如数组逆序可以通过双指针交换元素,杨辉三角需要正确计算每个位置的数值。合并有序数组的题目需要注意从后向前合并以避免覆盖元素,这点在引用4中提到的问题里很重要,需要详细说明。
另外,用户提到需要生成相关问题,可能需要包括每个练习题的扩展问题,比如时间复杂度的分析、不同解法的比较等。不过根据用户最后的示例,可能只需要列出相关问题,不需要详细展开,所以得在最后添加一个相关问题部分,比如关于优化、应用场景等。
需要确保所有数学公式使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。虽然当前问题可能涉及数学较少,但如果有比如在查找最大数时计算时间复杂度,可能需要用到。
最后,引用用户提供的站内引用,特别是引用3和4,在回答中适当的位置添加引用标识,例如在提到数组逆序或合并数组时标注[^3][^4]。同时,确保使用中文回答,代码部分语法正确,符合Java规范。
总结步骤:
1. 整理用户提供的引用中的数组练习题。
2. 补充其他常见数组题目,确保多样性。
3. 每个题目给出问题描述、示例代码和解析。
4. 检查代码正确性和格式。
5. 添加相关问题部分。
6. 正确引用站内资料。</think>### Java数组经典练习题与解析
---
#### 1. 数组逆序
**题目**:将数组元素顺序反转。例如,输入$[1,2,3,4,5]$,输出$[5,4,3,2,1]$。
**示例代码**:
```java
public static void reverseArray(int[] arr) {
int left = 0, right = arr.length - 1;
while (left < right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
```
**解析**:通过双指针从两端向中间遍历,交换元素位置,时间复杂度为$O(n)$[^3]。
---
#### 2. 合并两个有序数组
**题目**:将有序数组`nums2`合并到`nums1`中,确保`nums1`仍有序。假设`nums1`有足够空间(例如初始长度为$m+n$)。
**示例代码**:
```java
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
while (j >= 0) {
if (i >= 0 && nums1[i] > nums2[j]) {
nums1[k--] = nums1[i--];
} else {
nums1[k--] = nums2[j--];
}
}
}
```
**解析**:从后向前填充,避免覆盖`nums1`原有元素,时间复杂度$O(m+n)$。
---
#### 3. 杨辉三角生成
**题目**:生成前$n$行的杨辉三角。例如,$n=5$时输出:
```
[1]
[1,1]
[1,2,1]
[1,3,3,1]
[1,4,6,4,1]
```
**示例代码**:
```java
public List<List<Integer>> generatePascalTriangle(int n) {
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < n; i++) {
List<Integer> row = new ArrayList<>();
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
row.add(1);
} else {
row.add(result.get(i-1).get(j-1) + result.get(i-1).get(j));
}
}
result.add(row);
}
return result;
}
```
**解析**:每行首尾为$1$,中间元素为上一行相邻两数之和[^3]。
---
#### 4. 寻找缺失的数字
**题目**:在$0$到$n$的数组中查找缺失的一个数。例如,输入$[3,0,1]$,输出$2$。
**示例代码**:
```java
public int missingNumber(int[] nums) {
int sum = 0, n = nums.length;
for (int num : nums) sum += num;
return n * (n + 1) / 2 - sum;
}
```
**解析**:利用高斯公式计算理论总和,减去实际总和即为缺失值,时间复杂度$O(n)$。
---
#### 5. 数组去重(原地)
**题目**:原地删除有序数组中的重复项,返回新长度。例如,输入$[1,1,2]$,输出长度$2$,数组变为$[1,2]$。
**示例代码**:
```java
public int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int k = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[k]) {
nums[++k] = nums[i];
}
}
return k + 1;
}
```
**解析**:双指针法,快指针遍历,慢指针标记非重复位置,时间复杂度$O(n)$。
---
Java数组练习题
### Java 数组练习题及相关代码
以下是几个经典的 Java 数组练习题及其对应的实现代码:
#### 1. **求数组中的最大值**
通过遍历数组找到其中的最大值。
```java
public class MaxValue {
public static void main(String[] args) {
int[] arr = {3, 5, 7, 2, 8};
System.out.println("Max Value: " + findMax(arr));
}
public static int findMax(int[] arr) {
if (arr == null || arr.length == 0) {
throw new IllegalArgumentException("Array is empty or null");
}
int max = arr[0];
for (int num : arr) {
if (num > max) {
max = num;
}
}
return max;
}
}
```
此代码实现了求数组中最值的功能[^1]。
---
#### 2. **求数组的平均值**
计算整型数组中所有元素的平均值。
```java
public class AverageValue {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
System.out.println("Average Value: " + calculateAvg(arr));
}
public static double calculateAvg(int[] arr) {
if (arr == null || arr.length == 0) {
throw new IllegalArgumentException("Array is empty or null");
}
int sum = 0;
for (int x : arr) {
sum += x;
}
return (double) sum / arr.length;
}
}
```
这段代码展示了如何利用循环结构来完成数组平均值的计算功能[^2]。
---
#### 3. **查找数组中的指定元素**
使用顺序查找法在一个整型数组中定位某个特定数值的位置。
```java
public class SearchElement {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50};
int target = 30;
int result = search(arr, target);
if (result != -1) {
System.out.println("Element found at index: " + result);
} else {
System.out.println("Element not found.");
}
}
public static int search(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
}
```
上述程序演示了基本的线性搜索技术用于在数组中寻找目标项的方法。
---
#### 4. **找出数组中出现次数最多的元素**
采用投票算法(Boyer-Moore Majority Vote Algorithm),可以高效地确定数组中占多数的元素。
```java
public class MajorityElement {
public static void main(String[] args) {
int[] nums = {3, 2, 3, 1, 2, 2};
System.out.println("Majority Element: " + findMajority(nums));
}
public static int findMajority(int[] nums) {
int count = 0;
Integer candidate = null;
for (int num : nums) {
if (count == 0) {
candidate = num;
}
count += (candidate == num) ? 1 : -1;
}
return candidate;
}
}
```
该解决方案基于一种高效的计数策略,适用于处理大规模数据集的情况[^4]。
---
#### 5. **向有序数组中插入新元素并保持其顺序**
当需要将一个新的数字加入已排序好的数组时,可以通过调整现有元素位置的方式维持原有的排列次序。
```java
import java.util.Arrays;
public class InsertIntoSortedArray {
public static void main(String[] args) {
int[] arr = {1, 3, 4, 5, 7, 9, 0}; // Last element reserved as placeholder
int valueToInsert = 6;
insertAndSort(arr, valueToInsert);
System.out.println(Arrays.toString(arr));
}
private static void insertAndSort(int[] arr, int newValue) {
int pos = arr.length - 1;
while (pos >= 0 && arr[pos - 1] > newValue) {
arr[pos] = arr[pos - 1];
pos--;
}
arr[pos] = newValue;
}
}
```
这里提供了一种有效的方式来更新包含预留空间的固定大小数组的内容[^5]。
---
### 总结
以上示例涵盖了多种常见的数组操作技巧,包括但不限于求最值、统计均值、检索特定条目以及执行高级分析任务等。每一段代码都经过精心设计以满足实际应用场景下的需求,并附带必要的错误检测逻辑确保健壮性和可靠性。
阅读全文
相关推荐







