Java数组练习题

1、两数之和

要求:给定一个整数数组,nums 和目标值 target ,再给数组中找出和为目标值的两个整数,并返回他们的下标。

示例:

给定nums={2,7,11,19}

因为nums[0]+nums[1]=9

返回[0,1]

思路:双重循环 i(从第一个元素起) 先不动 j (从i之后起)动,找到符合条件nums[i]+nums[j]=target,找到返回i,j,未找到i++, j (从i之后起),继续++ 找,找到返回,未找到返回-1,-1。

代码:

import java.util.Arrays;
public class TestDemo {
    public static void main(String[] args) {
        int[] nums = {2, 7, 11,19};
        int target=9;
        int[] arr=twoSum(nums,target);
        System.out.println(Arrays.toString(arr));
    }
    public static int[] twoSum(int[] nums,int t){
        int[] ret=new int[]{-1,-1};
        for (int i = 0; i < nums.length; i++) {
            for (int j = i+1; j < nums.length; j++) {
                if(nums[i]+nums[j]==t){
                    return new int[]{i,j};
                }
            }
        }
        return null;
    }
}
//运行结果:[0, 1]

2、主要元素

要求:数组中占比超过一般的元素称之为主要元素。给定一个整数数组,找到她的主要元素。若没有,返回-1.

示例:

输入[1,2,5,9,9,5,5,5]

输出:5

思路:控制  i  和  j  字节的距离大于数组长度的一半,观察arr[i] 与arr[j] 是否相等,若相等说明arr[i]是关键元素。

代码:

import java.util.Arrays;
public class TestDemo {
    public static void main(String[] args) {
        int[] arr={1,2,5,9,5,9,5,5,5};
        int ret=majorityEle(arr);
        System.out.println(ret);
    }
    public static int majorityEle(int[] arr){
        Arrays.sort(arr);
        int len=arr.length;
        for (int i = 0; i <=len/2 ; i++) {
            for (int j = i+len/2; j < len; j++) {
                if(arr[i]==arr[j]){
                    return arr[i];
                }
            }
        }
        return -1;
    }
}
//运行结果:5



3、找数组中的最大元素

public class TestDemo {
    public static void main(String[] args) {
        int[] arr={1,2,5,9,5,9,5,5,5};
        int max=max(arr);
        System.out.println(max);
    }
    public static int max(int[] arr) {
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }
}

4、求数组中元素的平均值

public class TestDemo {
    public static void main(String[] args) {
        int[] arr={1,2,5,9,5,9,5,5,5};
        System.out.println(avg(arr));
    }
    public static double avg(int[] arr) {
        int sum = 0;
        for (int x : arr) {
            sum += x;
        }
        return (double)sum / (double)arr.length;
    }
}

5、二分查找

基于一个有序数组的查找

import java.util.Arrays;
public class TestDemo {
    public static void main(String[] args) {
        int[] arr={1,2,18,16,4,59,9};
        Arrays.sort(arr);
        System.out.println(binarySearch(arr,9));
    }
    public static int binarySearch(int[] arr, int toFind) {
        int left = 0;
        int right = arr.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (toFind < arr[mid]) {
                right = mid - 1;
            } else if (toFind > arr[mid]) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }
}

也可以直接使用工具

import java.util.Arrays;
public class TestDemo {
    public static void main(String[] args) {
        int[] arr={1,2,18,16,4,59,9};
        Arrays.sort(arr);
        System.out.println(Arrays.binarySearch(arr,9));
    }
}

6、冒泡排序及优化

优化:设置一个标志位,如果在一次扫描中未发现交换,则代表数组已经有序了,直接退出。

import java.util.Arrays;
public class TestDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 18, 16, 4, 59, 9};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void bubbleSort(int[] arr) {
        boolean f;
        for (int i = 0; i < arr.length-1; i++) {
            f=false;
            for (int j = 0; j <arr.length-1-i ; j++) {
              if(arr[j]>arr[j+1]) {
                  int t=arr[j];
                  arr[j]=arr[j+1];
                  arr[j+1]=t;
                  f=true;
              }
            }
            if(f==false){
                return;
            }
        }
    }
}

 

7、数组逆序

思路 :设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素. 然后让前一个下标自增, 后一个下标自减, 循环继续即可.(就地逆置 )

import java.util.Arrays;
public class TestDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 18, 16, 4, 59, 9};
        reverse(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void reverse(int[] arr) {
        int left = 0;
        int right = arr.length - 1;
        while (left < right) {
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }
    }
}

8、数组数字排列

给定一个整型数组, 将所有的偶数放在前半部分, 将所有的奇数放在数组后半部分

基本思路: 设定两个下标分别指向第一个元素和最后一个元素. 用前一个下标从左往右找到第一个奇数, 用后一个下标从右往左找到第一个偶数, 然后交换两个位置的元素. 依次循环即可。

import java.util.Arrays;
public class TestDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 18, 16, 4, 59, 9};
        transform(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void transform(int[] arr) {
        int left = 0;
        int right = arr.length - 1;
        while (left < right) {
            while (left < right && arr[left] % 2 == 0) {
                left++;
            }
            while (left < right && arr[right] % 2 != 0) {
                right--;
            }
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
        }
    }
}

 交换两个数组:

import java.util.Arrays;
public class Test{
    public static void main(String[] args) {
        int[] a= {1,2,3,4,5,6};
        int[] b= {4,5,6};
        System.out.println("a:"+Arrays.toString(a));
        System.out.println("b:"+Arrays.toString(b));
        swap(a,b);
        System.out.println("交换后:");
        System.out.println("a:"+Arrays.toString(a));
        System.out.println("b:"+Arrays.toString(b));
    }
    public static void swap(int[] a,int[] b) {
        int len = a.length < b.length ? a.length : b.length;
        for (int i = 0; i < len; i++) {
            int t = a[i];
            a[i] = b[i];
            b[i] = t;
        }
         if (a.length > b.length) {
            System.out.println("b数组长度不足");
            for (int i = len; i <a.length; i++) {
                a[i]=0;
            }
        }else{
            System.out.println("a数组长度不足");
            for (int i = len; i <b.length; i++) {
                b[i] = 0;
            }
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9、

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值