java-四则运算-四

题目要求:查找数组连成环形的和最大的连续子数组

实验代码:

 1 package zuoYe;
 2
 3 import java.util.Scanner;
 4
 5
 6 public class MaxSubArray {
 7     public static void main(String[] args) {
 8         Scanner scan = new Scanner(System.in);
 9
10
11         //输入数据
12         System.out.println("请输入数组长度");
13         int n = scan.nextInt();
14         int[] a = new int[n];
15
16         System.out.println("请输入数组元素");
17         for(int i = 0;i < n;i++)
18         {
19             a[i] = scan.nextInt();
20         }
21         scan.close();
22         //计算此数组的和最大的连续子数组
23         int[] result = maxSub(a,a.length);
24         System.out.println("不连接成环的和最大的连续子数组:");
25         for(int i = result[0];i <= result[1];i++)
26         {
27             System.out.print(a[i] + "\t");
28         }
29         System.out.println("和为:" + result[2]);
30
31
32
33
34         //将此数组连成一个环,再计算此数组的和最大的连续子数组
35         //连成一个环即将数组后再接上此数组,但是数组的最后一个元素不用接,相当于计算接上之后的数组的和最大子数组
36         int[] b = new int[2 * n - 1];
37         for(int i = 0;i < n - 1;i++)
38         {
39             b[i] = a[i];
40             b[n + i] = a[i];
41         }
42         b[n - 1] = a[n - 1];
43         int[] result2 = maxSub(b,n);
44         System.out.println("\n\n将数组连成环后的和最大的连续子数组:");
45         for(int i = result2[0];i <= result2[1];i++)
46         {
47             System.out.print(b[i] + "\t");
48         }
49         System.out.println("和为:" + result2[2]);
50
51
52     }
53
54
55
56
57     //计算a数组的和最大的连续子数组(a数组为连成环后的等价数组,即原数组的二倍,n为原数组的长度)
58     public static int[] maxSub(int[] a,int n)
59     {
60         int an = a.length;//连成环的等价数组的长度
61         int currectSum = a[0];//记录当前累加和,初始值为a[0]
62         int currectStartIndex = 0;//记录当前累加的起始下标,初始值为0
63         int count = 1;//记录累加元素的个数,初始值为1
64         int[] result = new int[3];//记录结果子数组的信息,
65         result[0] = 0;//结果子数组的开始下标
66         result[1] = 0;//结果子数组的结束下标
67         result[2] = a[0];//结果子数组的和
68         for(int i = 1;i < an;i++)//依次遍历a数组的每个元素
69         {
70             if(currectSum <= 0)//如果当前累加和不大于0,不大于0对后续的元素没有贡献,可以去掉了,所以应从a[i]处重新开始加
71             {
72                 currectSum = a[i];//将当前累加和赋值为a[i]
73                 currectStartIndex = i;//将当前累加的开始下标赋值为i
74                 count = 1;//将累加元素的个数记为1
75             }
76             else//当前累加和大于0,则继续加a[i]
77             {
78                 currectSum += a[i];
79                 count++;//当前累加元素的个数加一
80             }
81             if(currectSum > result[2])//如果当前累加和大于原结果数组的累加和result[2],则应该将结果子数组信息更新为当前子数组,因为当前子数组的累加和大于结果子数组的和
82             {
83                 result[0] = currectStartIndex;//结果子数组的开始下标为当前子数组的开始下标
84                 result[1] = i;//结果子数组的结束下标赋值为i
85                 result[2] = currectSum;//结果子数组的累加和赋值为当前子数组的累加和
86             }
87             if(count >= n)//如果累加的元素个数等于原数组(未连成环的数组)的长度,则说明已经加了最多的元素,不能再加了,也就是说和最大的子数组即为原数组,应该结束循环
88             {
89                 break;
90             }
91         }
92         return result;
93     }
94
95
96
97 }

实验截图:

时间: 2024-08-06 19:46:07

java-四则运算-四的相关文章

java第四章编程题(初学篇)

代码: 1 /* 2 test.java 3 */ 4 package test; 5 public class test { 6 public static void main(String args[] ) 7 { 8 CPU ccp= new CPU(); 9 HardDisk hhd=new HardDisk(); 10 PC pc =new PC(); 11 ccp.setSpeed(2200); 12 hhd.setAmount(200); 13 pc.setCPU(ccp); 14

java中四种访问修饰符区别及详解全过程

客户端程序员:即在其应用中使用数据类型的类消费者,他的目标是收集各种用来实现快速应用开发的类. 类创建者:即创建新数据类型的程序员,目标是构建类. 访问控制存在的原因:a.让客户端程序员无法触及他们不应该触及的部分  : b.允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员  java的四个关键字:public.protected.default.private(他们决定了紧跟其后被定义的东西可以被谁使用) 适用范围<访问权限范围越小,安全性越高>   访问权限   类  

Java的四种引用类型

Java中有四种引用类型:强引用.软引用.弱引用.虚引用.--应该是从1.2版本开始添加的. 这个概念是与垃圾回收有关的. 如果你不知道这几个概念,那你用的肯定都是强引用.例如String str = new String(); 这个str到 new String() 的引用类型就是强引用. 那什么是弱引用呢?先看一段代码: 1 package cn.larry.pojo; 2 3 public final class Product { 4 private String name; 5 6 p

Java解惑四:异常之谜

谜题36 finally语句中的return语句会覆盖掉try语句中的. 谜题37 该部分还需要进一步理解 一个方法可以抛出的被检查异常集合是它所适用的所有类型声明要抛出的被检查集合的交集. Java解惑四:异常之谜,布布扣,bubuko.com

Java基础四

Java基础四 一.Switch语句 二.if和switch区别 推荐使用if 三.函数 Java中的函数和方法是同一个词 四.数组 4.1.数组常见错误 五.内存机制 六.转换成十六进制 移位 &操作 6.2 查表法求十六进制 查表法很多时候都非常好用,这样就非常好了,真的非常好用 算的时候直接移四位,我喜欢,我觉得以后可以多做移位运算,真的是简单方便 6.3 查表法求星期几

Java的四种引用源代码例子

Java的四种引用源代码例子 不解释,直接上代码,千言万语顶不住一行代码. package com.apkkids.javalanguage; import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference

JAVA web四种属性范围总结

首先必须要了解客户端跳转和服务器端跳转的区别: 客户端跳转: response.sendRedict(String path),地址栏发生改变.不能传递request属性. 服务器端跳转:<jsp:forward> 地址栏不发生改变.能传递request属性. request属性范围: 只有在服务器端跳转以后,所有设置的内容才会停留下来. session属性范围:  不管是客户端跳转还是服务器端跳转,只要是是属性设置了都可以取得. 1:page:(pageContext) 只在一个页面中保存属

《Thinking In Java第四版》拾遗

<Thinking In Java第四版>拾遗 转自我的github(http://katsurakkkk.github.io/2016/05/Thinking-In-Java%E7%AC%AC%E5%9B%9B%E7%89%88-%E6%8B%BE%E9%81%97) 近日重读了<Thinking In Java第四版>(可能版本比较老),发现一些有趣的和值得注意的地方,在此作个记录. 返回值过载 不能用返回值对函数进行overload,因为有可能调用方并不关心返回值,这就造成了

java中四种引用类型

java中四种引用类型  今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在网上查资料,感觉收获颇多,现记录如下. 对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地

Java四则运算表达式求解

压栈思想计算Java运算表达式 栈的规则是先进后出.利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字.一个用来存放对应的操作符.假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符.或者就是括号了.然后我们从左至右遍历每一个元素,遍历过程中遵循步骤和原则如下: (1)遇到数字则直接压到数字栈顶. (2)遇到运算符(+-*/)时,若操作符栈为空,则直接放到操作符栈顶,否则,见(3). (3)若操作符栈顶