zoukankan      html  css  js  c++  java
  • Practice| 数组

    /*
    从键盘确定班级的组号,在从键盘输入每一组的人数,并输入每一个学员的成绩,并求出,每一组的平均分,
    全部的平均分,每一组的最高分,全部的最高分,并显示结果.
    
    */
    class Test3{
        public static void main(String[] args){
            
            java.util.Scanner input = new java.util.Scanner(System.in);
    
            //先确定一共有多少个组;
            System.out.print("请输入一共有多少个组:");
            int groups = input.nextInt();
            
            int[][] scores = new int[groups][]; //如5个组,+ 人数
            
            //遍历输入每个组的人数
            
            for(int i = 0;i < scores.length;i++){
                
                System.out.print("请输入第" + (i+1) +"组的人数:");
                int num = input.nextInt();
                scores[i] = new int[num];  //确定每 i 行的列数 <==> 相当于一维数组;
                
            }
            
            //遍历scores二维数组,输入成绩即填充列数,默认值为0 ;
            for(int i = 0; i < scores.length;i++){
                for(int j = 0;j < scores[i].length;j++){
                    System.out.print("请输入第"+ (i+1) +"组" + "第"+ (j+1) + "个学员的成绩:");
                    int score = input.nextInt();
                    scores[i][j] = score;
                }
                System.out.println();
            }
            //每个组和班级的平均分
            int sumAll = 0;
            int countAll = 0;
            for(int i = 0; i < scores.length;i++){
                int sumGroup = 0; //每循环一次就会赋0 -->可求出每组的成绩
                int countGroup = 0;
                for(int j = 0;j < scores[i].length;j++){
                    sumAll += scores[i][j];
                    countAll++;
                    
                    sumGroup += scores[i][j];
                    countGroup++;
                }
                System.out.println("第" + (i+1) + "组的总分为:" + sumGroup + "	" + "第" + (i+1) + "组的平均分为:" + sumGroup/countGroup);
            }
            System.out.println("全班总分为:" + sumAll + "	" + "全班平均分为:" + sumAll/countAll);
            
            //求每个组和班级的最高分
            int max_ban = 0;
            for(int i = 0;i < scores.length;i++){
                int max_zu = 0;
                    //int max_ban = 0;
                for(int j = 0;j < scores[i].length;j++){
                    
                    if(scores[i][j] > max_zu){
                        max_zu = scores[i][j];
                    }
                    if(scores[i][j] > max_ban){
                        max_ban = scores[i][j];
                    }
                    
                }System.out.println("第" + (i+1) + "组的最高分为:" + max_zu);
                
            }System.out.println("全班最高分为:" + max_ban);
            
        }
    }

    数组的复制

    /*
    (1)已知一个数组存储了成绩
    int[] scores = {67,89,23,45,99};
    要让你把,所有不及格的成绩找出来,放到一个数组中
    结果:{23,45}
    
    (1)先统计不及格的有几个人,count个
    (2)新建数组  int[] low = new int[count];
    (3)再遍历scores,把不及格的复制到low数组中
    */
    
    class ArrayCopy{
        public static void main(String[] args){
            int[] scores = {67,89,23,45,99};
            int count = 0;
            for(int i = 0;i < scores.length; i++){
                if(scores[i] < 60){
                    count++;
                }
            }
            int[] low = new int[count];
    
            for(int i = 0,j = 0; i < scores.length && j<count; i++){ //&& j<count不写也可以不会超范围;
                if(scores[i] < 60){
                    //j = i;//i=2, 3
                    low[j] = scores[i];    //这里是关键啊啊
                    j++;
                }
            }
            
            //for(int i = 0;i<low.length;i++){
                //System.out.println(low[i]);
            //}
            for(int num : low){
                System.out.print("不及格的有:" + num + "
    ");
            }
        }
    }

    二分查找(前提是有顺序的)

    使用二分查找算法查找字符串数组中  {"a","b","c","d","e","f","g","h"} g的元素。

    * String类型:
     * (1)重写了equals方法
     * (2)实现了java.lang.Comparable接口
     *         这个接口的抽象方法  int compareTo(String str)
     */
    public class Test19 {
        public static void main(String[] args) {
            String[] arr = {"a","b","c","d","e","f","g","h"};
            String find = "g";
            
            int left = 0;
            int right = arr.length-1;
            int mid = (left + right)/2;
            int index = -1;
            
            while(left<=right){
                if(arr[mid].equals(find)){
                    index = mid;
                    break;
                }else if(find.compareTo(arr[mid])>0){//find比arr[mid]大,去mid的右边查找
                    left = mid +1;
                }else{
                    right = mid - 1;
                }
                mid = (left + right)/2;
            }
            System.out.println("g的下标是:" +index);
        }
    }
    //二分法
    class BinarySearch{
        public static void main(String [] args){
            int[] arr = {0,1,2,5,8,9,12,17,20};
            //int[] arr = {1,2,5,8,9,12,17,20};
            int index = -1;
            int find = 5;
            int left = 0;
            int right = arr.length - 1;
            int mid = (left + right) /2;
            
            
            while(left <= right){  //left left   left  left
                if(arr[mid] == find){//找到了
                    index = mid;
                    break;
                }else if(find < arr[mid]){//说明find在[mid]的左边
                    right = mid-1;
                }else{//说明find在[mid]的右边
                    left = mid + 1;    
                } 
                mid = (left + right)/2;
            }
            if(index==-1){
                System.out.println("未找到");
            }else{
                System.out.println("下标:" + index);
            } 
        }
    }

    冒泡排序(把大的往右边移动-下沉;把小的往左移动-冒泡)

    /*
    冒泡排序:
    从小到大
    
    //1、先照我这个写
    //2、如果我要求,每一轮从最后一个元素开始比较
    //我刚才,相当于把“大”往“右”移动
    //现在,把“小”往“左”移动
    /*
    冒泡排序:实现从小到大
    (1)方法一:把“大”往“右”移动,称为“下沉”
    (2)方法二:把“小”往“左”移动,称为“冒泡”
    
    
    */
    
    class BubbleSort{
        public static void main(String[] args){
            int[] arr = {3,9,4,2,1,8,6}; //6
            
            //从小到大:通过相邻元素的比较, 大的往后移动称为 下沉;
            
            for(int i = 1;i < arr.length-1;i++ ){
                for(int j = 0;j < arr.length-1;j++){
                    if(arr[j] > arr[j+1]){
                        int temp = 0;
                        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] + "	");
            }
            
        }
    }
    
    ---->>>
    1       2       3       4       6       8       9
    class BubbleSort{
        public static void main(String[] args){
            int[] arr = {3,9,4,2,1,8,6}; //6
            
            //从小到大:把 小 的往 左 移动;称为"冒泡"。
            for(int i = 0; i < arr.length;i++){
                for(int j = arr.length-1; j > i;j--){
                    if(arr[j] < arr[j-1]){  //如果后边的arr[j] < 前边的arr[j-1]
                        int temp = 0;
                        temp = arr[j-1];
                        arr[j-1] = arr[j];
                        arr[j] = temp;
                    }
                }
            }for(int i = 0;i < arr.length;i++){
                System.out.print(arr[i] + "	");
            }
        }
    }

    ---->>>
    1       2       3       4       6       8       9

     

    package com.atguigu.exam;
    
    import java.util.Arrays;
    
    public class Test20 {
        public static void main(String[] args) {
            int[] array = {4,3,6,1};
            sort(array);
            System.out.println(Arrays.toString(array));
        }
        
        public static void sort(int[] arr){
            //轮数:n-1
            for (int i = 1; i < arr.length; i++) {
                //每一轮从左往右比较
                /*
                 * 当i=1,j=0,1,2,...arr.length-2   j<arr.length-i
                 */
                for (int j = 0; j < arr.length-i; j++) {
                    if(arr[j] > arr[j+1]){
                        int temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                    }
                }
            }
        }
    }

    直接选择排序

    /*
    
    直接选择排序-->>
    思路:
        每一轮找出本轮未排序元素中的最小值,然后和它应该在的位置的元素交换
        
    例如:
    第一轮:最小值是1,它的位置[4],它应该在[0],[4]和[0]位置元素交换  {1,2,7,9,4,6}
    第二轮:最小值是2,它的位置[1],它应该在[1],不动                   {1,2,7,9,4,6}
    第三轮:最小值是4,它的位置[4],它应该在[2],[4]和[2]位置元素交换  {1,2,4,9,7,6}
    第四轮:最小值是6,它的位置[5],它应该在[3],[5]和[3]位置元素交换  {1,2,4,6,7,9}    
    第五轮:最小值是7,它的位置[4],它应该在[4],不动
    */
    
    class TestSelectSort{
        public static void main(String[] args){
            int[] arr = {4,2,7,9,1,6};
            //外循环:5轮
            //i的循环值:0,1,2,3,4  i<arr.length-1
            for(int i = 0; i <arr.length-1;i++){
                //找出本轮的最小值及其下标
                //(1)先假设“本轮未排序部分”的第一个元素最小
                int min = arr[i];
                int index = i;
                
                //(2)用min 和 "剩余的元素" 进行比较,确定本轮的最小值; 从i+1开始比较,到最后;
                /*
                第一轮:未排序部分 [0,5],min=arr[0],index=0,j=1,2,3,4,5
                第二轮:未排序部分 [1,5],min=arr[1],index=1,j=2,3,4,5
                第三轮:未排序部分 [2,5],min=arr[2],index=2,j=3,4,5
                第四轮:未排序部分 [3,5],min=arr[3],index=3,j=4,5
                第五轮:未排序部分 [4,5],min=arr[4],index=4,j=5
                */
                
                for(int j = i+1; j < arr.length; j++){
                    if(min > arr[j]){
                        min = arr[j];
                        index = j;
                    }
                }
                
                
                //(3)把[index]位置的元素和它应该在的位置交换
                /*
                第一轮,最小值应该在[0],第一轮i=0
                第二轮,最小值应该在[1],第一轮i=1
                第三轮,最小值应该在[2],第一轮i=2
                第四轮,最小值应该在[3],第一轮i=3
                第五轮,最小值应该在[4],第一轮i=4
                */
                if(index != i){ //如果arr[index],即本轮的最小值,不在它应该在的位置[i],就要交换
                    int temp = arr[index];
                    arr[index] = arr[i];
                    arr[i] = temp;        
                }
            }
            for(int num : arr){
                System.out.print(num); //124679
            }
        
        
        }
    }
            
            
  • 相关阅读:
    POJ 3468 A Simple Problem with Integers
    BZOJ 4430 Guessing Camels
    POJ 2309 BST
    POJ 1990 MooFest
    cf 822B Crossword solving
    cf B. Black Square
    cf 828 A. Restaurant Tables
    Codefroces 822C Hacker, pack your bags!
    [HDU 2255] 奔小康赚大钱
    [BZOJ 1735] Muddy Fields
  • 原文地址:https://www.cnblogs.com/shengyang17/p/9986701.html
Copyright © 2011-2022 走看看