zoukankan      html  css  js  c++  java
  • 第二次软件工程课程总结

    1.返回一个数组中最大子数组的和

    要求:输入一个整形数组,数组里有正也有负数

               数组中连续的一个或多个数组组成一个子数组,每个子数组都有一个和

               求所有子数组的和的最大值,要求时间复杂度为O(n)

    思路:另设两个数组,一个记录和b[],一个记录当前子数组的个数c[]。如果原数组的第二个数加上第一个数的和小于第二个数,那么舍弃第一个数,当前子数组的个数为一。由此类推,直到遍历完所有数组。

    package test;
    
    import java.util.Random;
    import java.util.Scanner;
    
    
    public class array_test {
            public static void main(String[] args) {
                Scanner scanner=new Scanner(System.in);
                int[] num=new int[20];
                int number=0;
                int[] array1=new int[20];
                int a=scanner.nextInt();
                for(int i=0;i<a;i++) {
                    //随机生成数组里的数字
                    array1[i]=scanner.nextInt();
                }
                num[0]=array1[0];
                for (int i = 1; i < array1.length; i++) {
                    if(array1[i]+array1[i-1]>array1[i]) {
                        num[i]=num[i-1]+array1[i];
                        number=i+1;
                    }
                    else {
                        num[i]=array1[i];
                    }
                }
                int max=num[0];
                for(int i=1;i<num.length;i++) {
                    System.out.print(num[i]);
                    if(num[i]>max)
                        max=num[i];
                }
                System.out.print(max);
                System.out.print("  ");
        }
    }

    2.求一个循环数组中最大子数组的和

    要求:在第一问的前提下,将原数组变为循环数组

    思路:将原数组循环赋值,直到子数组的个数大于原数组的个数时停止

    import java.util.Random;
    import java.util.Scanner;
    
    
    public class huan {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int a[]=new int[10000];
            int b[]=new int[20000];
            int sum,d,temp1=0,temp2=0,flag1=0,flag2=0;  //分别记录子数列的起始和结束位置
            System.out.print("请输入数组元素的个数: ");
            Scanner sc=new Scanner(System.in);
            int m=sc.nextInt();
            if(m>999999)
            {
                System.out.print("请重新输入数组元素的个数: ");
                m=sc.nextInt();
            }
            Random rand = new Random();
            for(int i=0;i<m;i++)//循环为数组赋值
            {
                a[i] = rand.nextInt(40)-20;
                b[i] = a[i];
                b[i+m]=a[i];
                System.out.print(a[i]+" ");
            }
            sum=b[0];
            d=sum;
            for(int i=0;i<2*m;i++)//核心循环,来判断怎么产生最大子数组
            {
                if(d<=0){
                    d=0;
                    temp1=i+1;
                    temp2=i;
                }        
                d+=b[i+1];
                temp2++;
                if(d>sum){
                    sum=d;
                    flag1=temp1;
                    flag2=temp2;
                    if((flag2-flag1+1)>=m)
                    {
                        break;
                    }
                }
            }
            System.out.println("");
            System.out.print("子数组的组成元素为:    ");
            for(int i=flag1;i<=flag2;i++)
                System.out.print(b[i]+" ");
            System.out.println("");
            System.out.println("子数组和的最大值为:    "+sum);
        }
    
    }

    3.要求数组从文件中读取

    要求:数组从文件中读取

               如果输入的数组过大,考虑一下数的溢出

               保证文件中错误的参数不能导致程序的崩溃

    package test;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class array_test2 {
        public static void main(String[] args) throws IOException {
            FileReader fileReader=new FileReader("C:\\Users\\admin\\Desktop\\QQ\\test.txt");
            BufferedReader bReader=new BufferedReader(fileReader);
            StringBuffer stringBuffer=new StringBuffer();
            String[] strings=new String[50];
            String bb;
            String s="";
    
            while((bb=bReader.readLine())!=null) {
    
                s=s+bb;
            }
            String [] data=s.split(" ");
            int [] datas=new int [data.length];
            //将String类型数组转成int类型
            for(int j=0;j<data.length;j++)
            {
            datas[j]=Integer.parseInt(data[j]);
            }
            
            for(int i=0;i<datas.length;i++)
            {
            System.out.print(datas[i]+"   ");
            }
            
            int[] num=new int[50];
            num[0]=datas[0];
            int number=0;
            for(int i=1;i<datas.length;i++) {
                if(datas[i]+datas[i-1]>datas[i]) {
                    num[i]=datas[i]+num[i-1];
                    number=number+1;
                }
                else {
                    num[i]=datas[i];
                }
            }
            int max=num[0];
            for(int i=1;i<datas.length;i++) {
                System.out.print(num[i]+"  ");
                if(num[i]>max)
                    max=num[i];
            }
            System.out.print(max+"  ");
            System.out.print(number);
        }
    }
  • 相关阅读:
    【Android】: 部分注意事项
    【Java】:多线程下载
    【操作系统】:Main features of the X86-64
    「数据结构」:模拟指针(simulated pointer)
    「JAVA」:Berkeley DB的JAVA连接
    「python」: arp脚本的两种方法
    「数据结构」: 间接寻址
    「操作系统」: Conditional Move Instructions(trap)
    「操作系统」:The most useful condition codes
    quartz定时任务时间设置
  • 原文地址:https://www.cnblogs.com/wangzhaojun1670/p/12368515.html
Copyright © 2011-2022 走看看