Java数组练习
下面是关于数组的一些练习,程序中有题目要求以及对于解题的一部分注解
1.打印数组
public class Text4 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,};
printArray(arr);
}
public static void printArray(int[] array) {
for (int a:array) {//使用for-each循环输出数组
System.out.print(a + " ");
}
}
}
2.求数组的平均值
public class Text1 {//实现一个方法 avg, 以数组为参数, 求数组中所有元素的平均值(注意方法的返回值类型).
public static void main(String[] args) {
int[] array = new int[]{1,2,3,4,5,6,7,8};
System.out.println(avg(array));
}
public static double avg(int[] arr){
//将数组中每个值求和,最后除以数组长度即可
double sum = 0;
for (int i = 0; i <arr.length ; i++) {
sum += arr[i];
}
return sum/arr.length;
}
}
3.奇数位于偶数之前
public class Text1 {//调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你这组数据的长度:");
int a = sc.nextInt();
System.out.println("请分别输入你的这组数据:");
int[] arr = new int[a];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
System.out.println("你输入的这组数据是" + Arrays.toString(arr));
sort(arr);
System.out.println("--------------------------");
System.out.println("排序后的数据为" +Arrays.toString(arr));
}
public static void sort(int[] arr){
int left =0;
int right = arr.length-1;
while (left <= right){//外层循环,如果left大于right说明数组已经遍历了
while (arr[left]%2 != 0){//从左开始,若是奇数往后移一位
left++;
}
while (arr[right]%2 == 0){//从右开始,若是偶数往前移一位
right--;
}
if (left>right) {//如果left已经大于right说明已经排好序,就直接跳出循环即可
break;
}
//若左右都已移完,走到这一步说明左边是偶数右边是奇数,把数据进行交换即可
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
}
4.冒泡排序
import java.util.Arrays;
public class Text8 { //给定一个整型数组, 实现冒泡排序(升序排序)
public static void main(String[] args) {
int[] array = {2, 4, 1, 8, 5, 3, 6};
System.out.println("排序前" + Arrays.toString(array));
bubble(array);
System.out.println("---------------------------");
System.out.println("冒泡排序后" + Arrays.toString(array));
}
public static void bubble(int arr[]) {
//每次都把最大的数排到最后一位
for (int i = 0; i < arr.length - 1; i++) {//外层控制排序次数
int k = 1;//定义一个观察数字是否进行交换的变量
for (int j = 0; j < arr.length - i; j++) {
//内存控制每次排序需要比较那些数,每次比较次数都比上一次少1
if (arr[i] > arr[i + 1]) {
int tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
k = -1;//若交换了,将变量值修改为-1
}
}
//若某次内存循环结束k的值没变,说明以及排序完成,一次交换都没发生
if (k == 1) {
break;
}
}
}
}
5.数组是否有序
import java.util.Arrays;
public class Text8 {//给定一个整型数组, 判定数组是否有序(递增)
public static void main(String[] args) {
int[] array1 = {1,2,3,4,6,5};
int[] array2 = {1,2,3,4,5,6};
System.out.println("array1数组 " + jud(array1));
System.out.println("array2数组 " + jud(array2));
}
public static String jud(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
if (arr[i] > arr[i+1]){//循环判断数组每一个数是否小于他的下一位
return "无序";
}
}
return "有序";
}
}
6.二分查找
public class Text9 { //给定一个有序整型数组, 实现二分查找
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int n = 3;
int ret =find(arr,n);
if(ret == -1){//若返回值为-1说明没找到
System.out.println("该数组中没有" + n);
}else{
System.out.println("该数组中的"+n+"在第"+ret+"位");
}
}
public static int find(int[] arr,int n){
int i = 0;//定义i从数组最前边开始
int j = arr.length-1;//j从数组最后边开始
while (i < j){//
int m = (i+j)/2;//m为每次查找的中间点
if(arr[m] > n){//若m位置的数大于要找数字,说明该数字在m位置和j位置之间
i = m+1;//i和m之间的数已经没意义,让i走到m+1的位置,再进行查找
}else if(arr[m] < n){//在i和m之间
j = m-1;//j前往m-1的位置
}else {//m位置的数为n,说明找到了,返回位置m
return m;
}
}
return -1;//没找到返回-1
}
}
7.数组的拷贝
import java.util.Arrays;
public class Text10 {//实现一个方法 copyOf, 对一个整型数组进行拷贝, 得到一个新的数组.
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
System.out.println("原数组是"+ Arrays.toString(arr));
System.out.println("------------------------");
System.out.println("拷贝的数组是" +Arrays.toString(copyOf(arr)));
}
public static int[] copyOf(int[] arr){//创建一个新数组将原数组数据全部拷贝一遍
int[] a = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
a[i] = arr[i];
}
return a;
}
}
8.数组转字符串
public class Text11 {//实现一个方法 toString, 把一个整型数组转换成字符串. 例如数组 {1, 2, 3} , 返回的字符串为 "[1, 2, 3]", 注意 逗号 的位置和数量.
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
System.out.println(toString(array));
int[] arr = null;
}
public static String toString(int[] arr) {
if (arr == null) {//数组为null直接返回null
return null;
}
String ret = "[";//使用ret遍历储存数组的每一位
for (int i = 0; i < arr.length; i++) {//使用for循环遍历数组
if (i == arr.length - 1) {//若是最后一位需加一个“]”,不用加“,”
ret += arr[i] + "]";
}else {//每一位后加上“,”
ret += arr[i] + ",";
}
}
return ret;//返回该字符串
}
}