java炼精化气之数组上山

排序

选择排序

方法:当前元素与之后所有的元素进行比较,若后者小于前者则两者交换位置。

  • 从数组第一个元素开始。
  • 遍历整个数组,找到最小的元素。
  • 将最小的元素与数组第一个元素交换。
  • 从第二个元素开始重复上述步骤。

Selection Sort

public class Test05_01{
    public static void main(String[] args){
        int[] arr={7,4,5,9,8,2,1};
        for(int i=0;i<arr.length-1;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]>arr[j]){
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        for(int i=0;i<arr.length;i++){
        System.out.print(arr[i]+",");
        }
    }
}

冒泡排序

算法步骤

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

public class Test05_01{
    public static void main(String[] args){
        int[] arr={7,4,5,9,8,2,1};
        for(int i=0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        for(int i=0;i<arr.length;i++){
        System.out.print(arr[i]+",");
        }
    }
}

插入排序

 算法步骤

  • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

public class Test05_01{
    public static void main(String[] args){
        int[] arr={7,4,5,9,8,2,1};
        int e;
        int j;
        for(int i=1;i<arr.length;i++){
            e=arr[i];
            for(j=i;j>0&&arr[j-1]>e;j--){
                arr[j]=arr[j-1];
            }
            arr[j]=e;
        }
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+",");
        }

计数排序

  • 计数排序的核心思想是把一个无序序列 A 转换成另一个有序序列 B,从 B 中逐个“取出”所有元素,取出的元素即为有序序列

public class Test05_01{
    public static void main(String[] args){
        int[] arr={7,4,5,9,8,2,1};
        int min=arr[0];
        int max=arr[0];
        for(int i=0;i<arr.length;i++){
            if(arr[i]>max){
                max=arr[i];
            }
            if(arr[i]<min){
                min=arr[i];
            }
        }
        int[] nums=new int[max-min+1];
        int offset=min;
        for(int i=0;i<arr.length;i++){
            nums[arr[i]-offset]++;
        }
        int index=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=0){
                for(int j=0;j<nums[i];j++){
                    arr[index++]=i+offset;
                }
            }
        }
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+",");
        }
        */
    }
}

练习

思路1:数组长度不固定 需要读取一个数据 数组扩容 填入数据数据填入之后进行排序 然后遍历数组依次判断数据的个数连续相等。2 2 2 2 3 3 4 4 4 4 5 5 6 6 6 6 7 7

思路2:借助计数排序的思想 将数组固定起来。

import java.util.*;
class Demo05_01{
    public static void main(String[] args){
        //1.获取用户输入的数据 动态的扩容数组填充数据
        Scanner scanner = new Scanner(System.in);
        int[] arr=new int[0];
        System.out.print("Enter numbers:");
        while(true){
            int num=scanner.nextInt();
            if(num==0){
                break;
            }
            //验证用户输入数据的正确性
            if(num<1||num>100){
                System.out.println("有非法数据!");
                return;
            }
            arr=copyOf(arr,arr.length+1);
            arr[arr.length-1]=num;
        }
        //2.按照输出结果 将数据中的数据进行排序
        insertSort(arr);
        //3.输出连续相等的数字
        show(arr);
    }
    public static int[] copyOf(int[] arr,int newLen){
        int[] newArr=new int[newLen];
        for(int i=0;i<arr.length;i++){
            newArr[i]=arr[i];
        }
        return newArr;
    }
    public static void insertSort(int[] arr){
        for(int i=1;i<arr.length;i++){
            int e=arr[i];
            int j;
            for(j=i;j>0&&arr[j-1]>e;j--){
                arr[j]=arr[j-1];
            }
            arr[j]=e;
        }
    }
    /*
    Arrays Math都是属于工具类
    Arrays 特殊的是数组的工具类
        toString(arr) 就是将数据的每个元素进行拼接 并返回拼接后的字符串数据
        "[1,2,3,4]"
    */
    public static void show(int[] arr){
        System.out.println(Arrays.toString(arr));
        //此时就将问题转成了如何判断连续相等的数据分别出现多少次
        //[1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6]
        for(int i=0;i<arr.length;){
            int count=1;
            for(int j=i+1;j<arr.length;j++){
                if(arr[j]==arr[i]){
                    count++;
                }else{
                    break;
                }
            }
            System.out.println(arr[i]+" occurs "+count+(count>1?" times":" time"));
            i+=count;
        }
    }
}

import java.util.Scanner;
 
public class Home05_02 {
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		int[] f = new int[10];
		
		System.out.print("Enter ten numbers: ");
		int count=0;
		
		for(int i=1;i<10;i++){
			int number = input.nextInt();
			int j;
			for(j=0;j<count;j++){
				if(number==f[j]){
					break;
				}	
			}
			if(j==count){
				f[count]=number;
				count++;
			}
		}
		System.out.print("The distinct numbers are: ");
		for(int i=0;i<count;i++){
			System.out.print(f[i]+" ");
		}
	}
}

import java.util.*;
class Demo05_03{
    public static void main(String[] args){
        //1.获取用户的输入 只不过第一个输入的数据时数据的个数(数组的长度)
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter a list:");
        int len=scanner.nextInt();//获取的第一个数值就是数组的长度
        int[] arr=new int[len];
        for(int i=0;i<arr.length;i++){
            arr[i]=scanner.nextInt();
        }
        //2.对数组进行有序的判断
        if(isSorted(arr)){
            System.out.println("The list is already sorted.");
        }else{
            System.out.println("The list is not sorted.");
        }
    }
    public static boolean isSorted(int[] list){
        //如果不是升序排列 那么势必会出现有一组数据 左大右小的情况
        for(int i=1;i<list.length;i++){
            if(list[i-1]>list[i]){
                return false;
            }
        }
        return true;
    }

}

class Demo05_05{
    public static void main(String[] args){
        int[] list1={1,2,3,4,5,6,7};
        int[] list2={1,2,3,4,5,7,6};
        System.out.println(equals(list1,list2));
    }
    public static boolean equals(int[] list1,int[] list2){
        //判断两个数组是否完全相同
        //1.先判断长度
        if(list1.length!=list2.length){
            return false;
        }
        //2.再依次判断元素大小
        for(int i=0;i<list1.length;i++){
            if(list1[i]!=list2[i]){
                return false;
            }
        }
        return true;
    }
}

class Demo05_06{
    public static void main(String[] args){
        int[] arr={1,1,1,1,2,2,2,2,2,3,3,3,3,3,4};
        for(int i=0;i<arr.length;){
            int count=1;
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]==arr[j]){
                    count++;
                }else{
                    break;
                }
            }
            if(count>=4){
                System.out.println(arr[i]);
                return;
            }
            i+=count;
        }
        System.out.println("没有!");
    }
}

import java.util.*;
class Demo05_07{
    public static void main(String[] args){
        int[] list1={1,3,5,7,9};
        int[] list2={2,4,6,8,10};
        System.out.println(Arrays.toString(merge(list1,list2)));
    }
    /*
    有序数组的合并
    最主要的问题在于 数组之间有长有短
    */
    public static int[] merge(int[] list1,int[] list2){
        if(list1==null&&list2==null){
            return null;
        }
        if(list1==null){
            return list2;
        }
        if(list2==null){
            return list1;
        }
        //只有两个都不是null的情况再考虑具体操作
        int[] list3=new int[list1.length+list2.length];
        int p1=0;
        int p2=0;
        int p3=0;
        while(true){
            if(p1==list1.length&&p2==list2.length){
                break;
            }
            if(p1<list1.length&&p2==list2.length){
                list3[p3++]=list1[p1++];
            }else if(p1==list1.length&&p2<list2.length){
                list3[p3++]=list2[p2++];
            }else{
                if(list1[p1]<=list2[p2]){
                    list3[p3++]=list1[p1++];
                }else{
                    list3[p3++]=list2[p2++];
                }
            }
        }
        return list3;
    }
}

import java.util.Scanner;
public class Home05_09{
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        System.out.println("Enter number:");
        double[][] matrix=new double[3][4];
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[i].length;j++){
                matrix[i][j]=input.nextDouble();
            }
        }
        //打印每列的和
        for(int col=0;col<matrix[0].length;col++){
            System.out.println(sumColumn(matrix,col));
        }
    }
    public static double sumColumn(double[][] m,int col){
        double sum=0;
        for(int row=0;row<m.length;row++){
            sum=sum+m[row][col];
        }
        return sum;
    }
}

public class Home05_10{
    public static void main(String[] args) {
        int m[] []={
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,16}
        };
        /*
        int sum=0;
        for(int i=0;i<m.length;i++){
            for(int j=0;j<m[i].length;j++){
                if(i==j){
                    sum=sum+m[i][j];
                }
            }
        }
        */
        /*主对角线
        int sum=0;
        for(int i=0;i<m.length;i++){
            sum=sum+m[i][i];
        }
        System.out.println(sum);
        */
        //副对角线
        int sum=0;
        for(int i=0;i<m.length;i++){
            sum=sum+m[i][m.length-1-i];
        }
        System.out.println(sum);
    }
}

public class Home05_11{
    public static void main(String[] args) {
        int[][] a={
            {1,3,2},
            {1,0,0},
            {1,2,2}
        };
        int[][] b={
            {0,0,2},
            {7,5,0},
            {2,1,1}
        };
        double [] [] c=new double[a.length][b[0].length];
        for(int i=0;i<c.length;i++){
            for(int j=0;j<c[i].length;j++){
                double sum=0;
                for(int k=0;k<b.length;k++){
                    sum+=a[i][k]*b[k][j];

                }
                c[i][j]=sum;
                System.out.print(c[i][j]+" ");
            }
            System.out.println();
        }
        
    }
}

五子棋

import java.util.*;
public class Home05_15{
    public static String[][]board;
    public static String BLACK_CHESS="O";   //黑棋
    public static String WHITE_CHESS="X";   //白棋
    public static Scanner scanner=new Scanner(System.in);
    public static void main(String[] args) {
        intiboard();
        printboard();
        startgame();
        gameover();

    }
    public static boolean gameover(){
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[i].length;j++){
                if(!board[i][j].equals("+")){
                    //向右
                    if(j<=board.length - 5){
                        boolean flag = true;
                        for(int c = 1;c<=4;c++){
                            if(board[i][j]!=board[i][j + c]){
                                flag = false;
                                break;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                    //向下
                    if(i<=board.length - 5){
                        boolean flag = true;
                        for(int r = 1;r<=4;r++){
                            if(board[i][j]!=board[i + r][j]){
                                flag = false;
                                break;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                    //向右下
                    if(i<=board.length - 5 && j<=board.length - 5){
                        boolean flag = true;
                        for(int k = 1;k<=4;k++){
                            if(board[i][j]!=board[i + k][j + k]){
                                flag = false;
                                break;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                    //向右上
                    if(i>=4 && j<=board.length - 5){
                        boolean flag = true;
                        for(int k = 1;k<=4;k++){
                            if(board[i][j]!=board[i - k][j + k]){
                                flag = false;
                                break;
                            }
                        }
                        if(flag){
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }
    public static void startgame(){
        int player=0;
        while(true){
            if(player%2==0){
                System.out.print(">>>请黑方下棋:");
                if(!putchess(BLACK_CHESS)){
                continue;
                }
            }
            else{
                System.out.print(">>>请白方下棋:");
                if(!putchess(WHITE_CHESS)){
                continue;
                }
            }
            if(gameover()){
                break;
            }
            player++;
        }
        System.out.println("游戏结束!");
    }
    public static boolean putchess(String chess){
        int x=scanner.nextInt()-1;
        int y=scanner.nextInt()-1;
        if(!board[x][y].equals("+")){
            System.out.println(">>>此处已有棋子,请重新下棋");
            return false;
        }
        board[x][y]=chess;
        printboard();
        return true;
    }
    public static void printboard(){
        System.out.print("  ");
        for(int i=0;i<=14;i++){
            System.out.printf("%2d",i+1);
        }
        System.out.println();
        for(int i=0;i<board.length;i++){
            System.out.printf("%2d ",i+1);
            for(int j=0;j<board[i].length;j++){
               System.out.print(board[i][j]+" ");
            }
            System.out.println();
        }
    }
    public static void intiboard(){
        board=new String[15][15];
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[i].length;j++){
                board[i][j]="+";
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值