1. 创建数组
//第一种创建和初始化的方法
int[] arr = new int[10];
//第二种创建和初始化的方法
int[] arr2 = new int[]{0, 1, 2, 3, 5, 6, 8};
System.out.println("arr2:" + Arrays.toString(arr2));
//第二种方式的简化版本:
int[] arr3 = {2, 5, 0, 4, 6, -10};
System.out.println("arr3" + Arrays.toString(arr3));
2. 查找一个元素
找到目标位置
public static int findByElement(int[] arr, int size, int key) {
for (int i = 0; i < size; i++) {
if (arr[i] == key)
return i;
}
return -1;
}
3. 插入一个元素
先找到目标位置,再后移插入
public static int add(int[] arr, int size, int element) {
//size和arr.length都表示元素的数量,都是从1开始编号
if (size >= arr.length)
throw new IllegalArgumentException("Add failed. Array is full.");
int index = size;
for(int i = 0;i<size;i++){
if (element<arr[i]){
index = i;
break;
}
}
for(int i = size;i>index;i--){
arr[i] = arr[i-1];
}
arr[index] = element;
return index;
}
也可以边遍历边移动元素
public static int add(int[] arr, int size, int element) {
//size和arr.length都表示元素的数量,都是从1开始编号
if (size >= arr.length)
throw new IllegalArgumentException("Add failed. Array is full.");
int i;
for(i = size;i>0;i--){
if (element<arr[i-1]){
arr[i] = arr[i-1];
}else {
arr[i] = element;
return i;
}
}
arr[i] = element;
return i;
}
4.删除一个元素
先找到目标位置,再覆盖
public static int removeByElement(int[] arr, int size, int key) {
int index = -1;
for (int i = 0; i < size; i++) {
if (arr[i] == key) {
index = i;
break;
}
}
size--;
if (index != -1) {
// for (int i = index + 1; i < size; i++)
// arr[i - 1] = arr[i];
// size--;
for (int i = index;i<size;i++){
arr[i] = arr[i+1];
}
}
return size;
}
5. 题目:判断单调数组
思路:
题目提示已经很清楚,只需循环两次分别判断是不是递增或者递减的,都不是就返回false。
也可以只遍历一次,当一次循环中既遇到递增又遇到递减情况就返回false。
class Solution {
public boolean isMonotonic(int[] nums) {
boolean isIncreasing = true;
boolean isDeclining = true;
for(int i = 1;i<nums.length;i++){
if(nums[i]>=nums[i-1]){
continue;
}else{
isIncreasing = false;
}
}
for(int i = 1;i<nums.length;i++){
if(nums[i]<=nums[i-1]){
continue;
}else{
isDeclining = false;
}
}
return isDeclining|isIncreasing;
}
}
6. 题目:合并两个有序数组
思路:
(1)直接将B数组拼接到A数组后面,然后排序,但是这样不符合面试官出题考察点
(2)新建一个数组C,然后依次有序插入,有待优化空间
(3)从小往大判断,依次将元素后移,但是这样时间复杂度不够好,思考有没有什么优化的方法,想A数组后面是无元素空着的能不能从后面插入,自然就想到从大往小插入。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m+n -1;
for(;i>=0&&n != 0&&m!=0;i--){
if(nums1[m-1] >= nums2[n-1]){
nums1[i] = nums1[m-1];
m--;
}else{
nums1[i] = nums2[n-1];
n--;
}
}
while(n>0){
nums1[i--] = nums2[--n];
}
}
}