天道酬勤,学无止境

Sum of elements in an array

I'm working on a simple assignment for a summer java course and was just hoping you guys could take a look at my code and see if the way I did it is the best way. The purpose is to create a simple int array with at least 25 elements and use a loop to traverse it and add up all the elements. I had some issues but looks like I got it to work. After I work it out I did a little research and saw some similar stuff where people were using a For Each loop (enhanced loop). Would that be a better option? I'm kinda confused on the best ways to use that opposed to a regular for loop.

Anyway, any comments or criticism in helping me be a better programmer!

public class Traversals {

    public static void main(String[] args) {

        int absenceTotal = 0;
        // initialize array with 30 days of absences.
        int absencesArr[] = { 1, 3, 0, 9, 8, 23, 1, 
                11, 23, 5, 6, 7, 10, 1, 5,
                14, 2, 4, 0, 0, 1, 3, 2, 1, 
                1, 0, 0, 1, 3, 7, 2 };

        for (int i = 0; i < absencesArr.length; i++) {
            absencesArr[i] += absenceTotal;
            absenceTotal = absencesArr[i];
        }
        System.out.println("There were " + absenceTotal + " absences that day.");
    }
}

评论

Don't modify the array. I would prefer the for-each loop. And you should consider that there may be a very large number of students, so I would probably use a long for sum. And formatted output. Putting that together into something like

long sum = 0;
for(int i : absencesArr) {       
    sum += i;
}   
// System.out.println("There were " + sum + " absences that day.");   
System.out.printf("There were %d absences that day.%n", sum);

public class Traversals {

    public static void main(String[] args) {

        int absenceTotal = 0;
        // initialize array with 30 days of absences.
        int absencesArr[] = { 1, 3, 0, 9, 8, 23, 1, 
                11, 23, 5, 6, 7, 10, 1, 5,
                14, 2, 4, 0, 0, 1, 3, 2, 1, 
                1, 0, 0, 1, 3, 7, 2 };

        for (int i = 0; i < absencesArr.length; i++) {
            // remove this
            //absencesArr[i] += absenceTotal;
            absenceTotal += absencesArr[i]; //add this
        }
        System.out.println("There were " + absenceTotal + " absences that day.");
    }
}

In Java 8 you can use stream api:

public class Traversals {
    public static void main(String[] args) {

        int absenceTotal = 0;
        // initialize array with 30 days of absences.

        int absencesArr[] = { 1, 3, 0, 9, 8, 23, 1, 
                11, 23, 5, 6, 7, 10, 1, 5,
                14, 2, 4, 0, 0, 1, 3, 2, 1, 
                1, 0, 0, 1, 3, 7, 2 };

        absenceTotal = IntStream.of(array).sum();

        System.out.println("There were " + absenceTotal + " absences that day.");
    }
}

In addition to other nice contributions, I am fan of for-each loop and will typically do it in one line.

for(int i : absencesArr) absenceTotal += i;
System.out.printf("There were %d absences that day.", absenceTotal);

But in some situations when I want to have control over my Object size/length/count, I will use for loop like following example:

for (int i = 0; i < absencesArr.length; i++) absenceTotal += absencesArr[i];
System.out.printf("There were %d absences that day.", absenceTotal);

And if I need to have more then one line of codes inside the for loop or for-each loop then I will put them all inside curly brackets { more than one line of code }.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • LeetCode 1588. 所有奇数长度子数组的和
    给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。 子数组 定义为原数组中的一个连续子序列。 请你返回 arr 中 所有奇数长度子数组的和 。 输入:arr = [1,4,2,5,3] 输出:58 解释:所有奇数长度子数组和它们的和为: [1] = 1 [4] = 4 [2] = 2 [5] = 5 [3] = 3 [1,4,2] = 7 [4,2,5] = 11 [2,5,3] = 10 [1,4,2,5,3] = 15 我们将所有值求和得到 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58 法一:暴力法,时间复杂度为O(n3): class Solution { public: int sumOddLengthSubarrays(vector<int>& arr) { int res = 0; for (int i = 0; i < arr.size(); ++i) { // i为计算连续数组和的起点 for (int sz = 1; sz + i <= arr.size(); sz += 2) { res += accumulate(arr.begin() + i, arr.begin() + i + sz, 0); } } return res; } }; 法二:使用前缀和数组,前缀和即前n个数字的和
  • Leetcode 5182. 删除一次得到子数组最大和
    今天参加了LeetCode第153场周赛,其中第三题和一道经典题目——连续子数组的最大和很像。 我们这道题目的解法和之前这道经典题目的思路有些关系,连续子数组的最大和的解法见链接 题目描述 给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。 换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。 注意,删除一个元素后,子数组 不能为空。 请看示例: 示例 1: 输入: arr = [1,-2,0,3] 输出: 4 解释: 我们可以选出 [1, -2, 0, 3],然后删掉 -2,这样得到 [1, 0, 3],和最大。 示例 2: 输入: arr = [1,-2,-2,3] 输出: 3 解释: 我们直接选出 [3],这就是最大和。 示例 3: 输入: arr = [-1,-1,-1,-1] 输出: -1 解释: 最后得到的子数组不能为空,所以我们不能选择 [-1] 并从中删去 -1 来得到 0。 我们应该直接选择 [-1],或者选择 [-1, -1] 再从中删去一个 -1。 提示: 1 <= arr.length <= 10^5 -10^4 <= arr[i] <= 10^4 题目分析 题目中提到
  • 数组中所有元素的总和(Sum of all elements in an array)
    问题 我是编程的初学者。 我想对数组中的所有元素求和。 我做了这个,但我看不到我的错误在哪里? function ArrayAdder(_array) { this.sum = 0; this.array = _array || []; } ArrayAdder.prototype.computeTotal = function () { this.sum = 0; this.array.forEach(function (value) { this.sum += value; }); return this.sum; }; var myArray = new ArrayAdder([1, 2, 3]); console.log(myArray.computeTotal()); 回答1 forEach回调中的this是指全局window对象。 要设置回调的上下文,请使用 Array#forEach 第二个参数来传递上下文。 this.array.forEach(function (value) { this.sum += value; }, this); // <-- `this` is bound to the `forEach` callback. function ArrayAdder(_array) { this.sum = 0; this.array = _array |
  • 给定零索引数组 & 该数组的均衡索引(A zero-indexed array given & An equilibrium index of this array)
    问题 给出了一个由 N 个整数组成的零索引数组 A。 该数组的均衡索引是任何整数 P 使得 0 ≤ P < N 并且较低索引的元素总和等于较高索引元素的总和,即 A[0] + A[1] + ... + A[P−1] = A[P+1] + ... + A[N−2] + A[N−1]。 假设零元素之和等于 0。如果 P = 0 或 P = N−1,则可能发生这种情况。 例如,考虑以下由 N = 8 个元素组成的数组 A: A[0] = -1 A[1] = 3 A[2] = -4 A[3] = 5 A[4] = 1 A[5] = -6 A[6] = 2 A[7] = 1 P = 1 是该数组的均衡指数,因为: A[0] = −1 = A[2] + A[3] + A[4] + A[5] + A[6] + A[7] P = 3 是这个数组的均衡指数,因为: A[0] + A[1] + A[2] = −2 = A[4] + A[5] + A[6] + A[7] P = 7 也是一个均衡指数,因为: A[0] + A[1] + A[2] + A[3] + A[4] + A[5] + A[6] = 0 并且没有索引大于 7 的元素。 P = 8 不是均衡指标,因为它不满足条件 0 ≤ P < N。 现在我必须写一个函数: int solution(int A[], int N); 给定一个由 N
  • 在Swift数组中查找元素的总和(Finding sum of elements in Swift array)
    问题 快速找到整数数组总和的最简单(最佳)方法是什么? 我有一个称为倍数的数组,我想知道倍数的总和。 回答1 这是我能找到的最简单/最短的方法。 Swift 3和Swift 4: let multiples = [...] let sum = multiples.reduce(0, +) print("Sum of Array is : ", sum) 斯威夫特2: let multiples = [...] sum = multiples.reduce(0, combine: +) 更多信息: 这使用了Array的reduce方法(在此处提供文档),该方法允许您“通过递归应用提供的闭包将元素的集合减少到单个值”。 我们给它0作为初始值,然后实质上是闭包{ $0 + $1 } 。 当然,我们可以将其简化为单个加号,因为这就是Swift的滚动方式。 回答2 Swift 3+一支衬板可对对象的属性求和 var totalSum = scaleData.map({$0.points}).reduce(0, +) 点是我要减少的自定义对象scaleData中的属性 回答3 在Swift 4中,您还可以将序列元素约束为数字协议,以返回序列中所有元素的总和,如下所示 extension Sequence where Element: Numeric { /// Returns the sum
  • 漫画:如何在数组中找到和为 “特定值” 的三个数?
    小灰 程序员小灰前一段时间,我们介绍了LeetCode上面的一个经典算法题【两数之和问题】。这一次,我们把问题做一下扩展,尝试在数组中找到和为“特定值”的三个数。题目的具体要求是什么呢?给定下面这样一个整型数组:我们随意选择一个特定值,比如13,要求找出三数之和等于13的全部组合。由于5+6+2=13, 5+1+7=13,3+9+1=13,所以最终的输出结果如下:【5, 6,2】【5, 1,7】【3, 9,1】小灰的思路,是把原本的“三数之和问题”,转化成求n次“两数之和问题”。我们以上面这个数组为例,选择特定值13,演示一下小灰的具体思路:第1轮,访问数组的第1个元素5,把问题转化成从后面元素中找出和为8(13-5)的两个数:如何找出和为8的两个数呢?按照上一次所讲的,我们可以使用哈希表高效求解:第2轮,访问数组的第2个元素12,把问题转化成从后面元素中找出和为1(13-12)的两个数:第3轮,访问数组的第3个元素6,把问题转化成从后面元素中找出和为7(13-6)的两个数:以此类推,一直遍历完整个数组,相当于求解了n次两数之和问题。 public static List<List<Integer>> threeSum(int[] nums, int target) { List<List<Integer>> resultList = new ArrayList<>(); for
  • 漫画:如何在数组中找到和为 “特定值” 的三个数?
    小灰 程序员小灰前一段时间,我们介绍了LeetCode上面的一个经典算法题【两数之和问题】。这一次,我们把问题做一下扩展,尝试在数组中找到和为“特定值”的三个数。题目的具体要求是什么呢?给定下面这样一个整型数组:我们随意选择一个特定值,比如13,要求找出三数之和等于13的全部组合。由于5+6+2=13, 5+1+7=13,3+9+1=13,所以最终的输出结果如下:【5, 6,2】【5, 1,7】【3, 9,1】小灰的思路,是把原本的“三数之和问题”,转化成求n次“两数之和问题”。我们以上面这个数组为例,选择特定值13,演示一下小灰的具体思路:第1轮,访问数组的第1个元素5,把问题转化成从后面元素中找出和为8(13-5)的两个数:如何找出和为8的两个数呢?按照上一次所讲的,我们可以使用哈希表高效求解:第2轮,访问数组的第2个元素12,把问题转化成从后面元素中找出和为1(13-12)的两个数:第3轮,访问数组的第3个元素6,把问题转化成从后面元素中找出和为7(13-6)的两个数:以此类推,一直遍历完整个数组,相当于求解了n次两数之和问题。 public static List<List<Integer>> threeSum(int[] nums, int target) { List<List<Integer>> resultList = new ArrayList<>(); for
  • 【leetcode-Python】-前缀和-724. 寻找数组的中心索引
    题目链接 https://leetcode.com/problems/find-pivot-index/ 题目描述 给定整数数组 nums,返回数组的 “中心索引” 。一个数组的“中心索引”满足其左侧所有元素相加的和等于其右侧所有元素相加的和(均不包含中心索引位置的元素)。如果数组索引为0(指向数组左边界),那么该数组下标左侧所有元素相加的和为0(左侧没有任何元素)。如果数组索引指向数组右边界是类似的情况。 如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个。 nums的长度范围为[0,10000]。 示例 输入:[2,1,-1] 输出:0 中心索引为0,其左侧元素和为0(没有任何元素认为和为0),右侧元素1+(-1) = 0。 输入:[1,7,3,6,5,6] 输出:3 中心索引为3,其左侧元素和为1+7+3=11,右侧元素5+6 = 11。 解题思路 对于这个问题,我们可以遍历一遍数组,如果遍历到nums[i],如果知道nums[i]左侧元素的和left_sum(不包含当前位置的元素nums[i]),又知道数组中所有元素和total_sum,那么在nums[i]右侧的元素和right_sum(不包含当前位置的元素nums[i])可以表示为total_sum - left_sum-nums[i],因此在遍历过程中判断left
  • leetcode之array
    Array 最近在leetcode上写算法题,当然窝这样的🥦🐔只能从easy开始做起,就算是这样也发现自己在算法方面到底有多么的🥦 /(ㄒoㄒ)/~~ 那么这篇博客记录array系列的题目,按照编号排版吧 正文开篇之前,首先需要感谢力扣上各路大牛提供的思路和代码,同时也选择摘抄了我认为优雅的代码,如果需要删除的话,请私信我。🙏🙏🙏 26.Remove Duplicates from Sorted Array 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 对于这样的问题,有2种角度进行切入 发现 n u m i num_i numi​等于删除值发现 n u m i num_i numi​不等于删除值 第1种想法,大多数人都会自然而然地想到吧(包括我)😥但是这个想法想要实现非常困难
  • java方法使用循环将数组中的元素与元素相乘(java methods multiplying elements with in an array using a loop)
    问题 定义一个名为 weightedSum() 的 Java 方法,它接受两个整数数组作为其参数。 该方法使用循环将两个数组的相应元素相乘(即,它将每个数组的第一个参数相乘,然后将每个数组的第二个元素相乘,依此类推)并返回这些乘积的总和(这也是一个整数)。 您可以假设两个数组的长度相等。 public int weightedSum(int [] a ,int [] b) { int value; int sum ; for (int i = 0 ; i < a.length ; i++) { value = a[i] * b [i]; value = value +value ; } return value; 我在为我的作业编写此方法时遇到了麻烦。 我理解它接受数组,但我无法写出循环本身,以便它将数组的每个单独元素与相反数组中的对应元素相乘,因此 pos [1] * pos [1] 然后将两个值相加与 pos [2] + pos[2] 一起获得所有值的总和 回答1 以下是您的代码所需的更改。 基本上,在计算两个数组中相应元素的乘积后,您永远不会更新变量 sum。 此外,您可能想要使用 long 类型来存储总和和乘积的结果,因为如果数组中的元素足够大,则 int 值可能会溢出。 public long weightedSum(int [] a ,int [] b) { long
  • C中的2D数组和指针-如何访问元素?(2D array and pointer in C - how to access elements?)
    问题 我有一个涉及2D数组的指针的示例。 有人可以帮助我了解此示例中发生的情况吗? int main() { int i = 0, j=0, sum0=0, sum1=0; int data[4][3] = { {23,55,50},{45,38,55},{70,43,45},{34,46,60}}; int *Ptr; Ptr = *data; //Why is the indirection operator used here? // Does Ptr = 23 by this assignment? for (i=0; i<4; i++) { sum1 = 0; for (j = 0; j < 3; j++) { sum1 += data[i][j]; } if (sum1 > sum0) { sum0 = sum1; Ptr = *(data + i); // Seems like this statement makes Ptr } // point one row below ... what syntax } // can you use to access columns then? // Is it possible to use pointer arithmetic for (i=0; i<3; i++) // to access elements of
  • 如何将数组传递给 Perl XS 中的 C 函数?(How can I pass an array to a C function in Perl XS?)
    问题 如何通过引用 C XS 模块传递 Perl 数组? my @array = ( 1..20 ); XSTEST::test_array_passing(\@array); 我在 XS 中做什么才能看到数组? 回答1 XS 可以作为AV*或SV*接收对 ARRAY 的引用。 后者必须取消对AV*引用。 use Inline C => DATA; @array = (1 .. 20); $r = sum_of_elements1(\@array); $s = sum_of_elements2(\@array); print "$r $s\n"; # produces output: "210 210\n" __END__ __C__ double sum_of_elements1(AV* array) { int i; double sum = 0.0; for (i=0; i<=av_len(array); i++) { SV** elem = av_fetch(array, i, 0); if (elem != NULL) sum += SvNV(*elem); } return sum; } double sum_of_elements2(SV* array_ref) { AV* array; if (!SvROK(array_ref) || SvTYPE(SvRV
  • [Numpy函数]numpy.sum()
    众所周知,sum不传参的时候,是所有元素的总和。这里就不说了。 假设我生成一个numpy数组a,如下 这是一个拥有两维的数组,每一维又拥有三个数组,这个数组里面拥有四个元素。如果我们要将这个a数组中的第一个元素1定位出来,则我们会输入a[0][0][0]。好,这个axis的取值就是这个精确定位某个元素需要经过多少数组的长度,在这里是3,所以axis的取值有0,1,2。如果一个数组精确到某个元素需要a[n0][n1][n2][…][n],则axis的取值就是n。定位到这里,axis的参数的取值就解释完成了。 2 理解参数axis取值对sum结果的影响: 前面说了axis的取值(以数组a为例),axis=0,1,2。在这里,精确定位到某个元素可以用a[n0][n1][n2]表示。n0的取值是0,1(数组两维),代表第一个索引;n1的取值是0,1,2(每一维数组拥有3个子数组),代表第二个索引;n2的取值是0,1,2,3(每个子数组有4个元素),代表第三个索引,这几个取值在后面会用到。 2.1 axis = 0的时候: axis=0,对应n0已经确定下来,即n0取值定为0,1。所以sum每个元素的求和公式是sum = a[0][n1][n2]+a[1][n1][n2]。接下来确定sum的行数和列数,n1的取值是0,1,2,为3个数,代表行数,n2的取值是0,1,2,3,为4个数,代表列数
  • 迅速的总和(Swift running sum)
    问题 我想要一个在数字数组a(或可加性事物的任何有序集合)上的功能runningSum ,该函数返回长度相同的数组,其中每个元素i是A中所有元素的总和,直到包括i 。 例子: runningSum([1,1,1,1,1,1]) -> [1,2,3,4,5,6] runningSum([2,2,2,2,2,2]) -> [2,4,6,8,10,12] runningSum([1,0,1,0,1,0]) -> [1,1,2,2,3,3] runningSum([0,1,0,1,0,1]) -> [0,1,1,2,2,3] 我可以使用for循环执行此操作,也可以执行其他操作。 还有更多功能选择吗? 它有点像reduce,只是它会构建一个包含所有中间值的结果数组。 更通用的是具有可以接受任何序列并提供输入序列的总运行时间的函数。 回答1 您要寻找的通用组合器通常称为scan,并且可以使用reduce来定义它(类似于列表中的所有高阶函数): extension Array { func scan<T>(initial: T, _ f: (T, Element) -> T) -> [T] { return self.reduce([initial], combine: { (listSoFar: [T], next: Element) -> [T] in // because we
  • 找到所有连续子数组最大差异的总和(S)的最佳方法(optimal way to find sum(S) of all contiguous sub-array's max difference)
    问题 给定一个包含 n 个元素的数组: d[0], d[1], ..., d[n-1] 。 计算所有连续子数组的最大差值之和(S)。 形式上:S = sum{max{d[l,...,r]} - min{d[l, ..., r}} ,∀ 0 <= l <= r < n 输入: 4 1 3 2 4 输出: 12 解释: l = 0; r = 0; 数组:[1] sum = max([1]) - min([1]) = 0 l = 0; r = 1; 数组:[1,3] sum = max([1,3]) - min([1,3]) = 3 - 1 = 2 l = 0; r = 2; 数组:[1,3,2] sum = max([1,3,2]) - min([1,3,2]) = 3 - 1 = 2 l = 0;r = 3; 数组:[1,3,2,4] sum = max([1,3,2,4]) - min([1,3,2,4]) = 4 - 1 = 3 l = 1; r = 1 将导致零 l = 1; r = 2; 数组:[3,2] sum = max([3,2]) - min([3,2]) = 3 - 2 = 1; l = 1; r = 3; 数组:[3,2,4] sum = max ([3,2,4]) - min([3,2,4]) = 4 - 2 = 2; l = 2; r = 2; 将导致零 l
  • 如何在经过改组的连续整数数组中找到重复的元素?(How to find a duplicate element in an array of shuffled consecutive integers?)
    问题 我最近在某个地方遇到了一个问题: 假设您有一个1001个整数的数组。 整数按随机顺序排列,但是您知道每个整数都在1到1000(含)之间。 此外,每个数字在数组中仅出现一次,但一个数字出现两次。 假设您只能访问一次数组的每个元素。 描述找到重复数字的算法。 如果在算法中使用了辅助存储,是否可以找到不需要它的算法? 我有兴趣知道的是第二部分,即不使用辅助存储。 你有什么主意吗? 回答1 只需将它们加起来,然后减去如果只使用1001个数字,便可以得到的总数。 例如: Input: 1,2,3,2,4 => 12 Expected: 1,2,3,4 => 10 Input - Expected => 2 回答2 更新2:有人认为使用XOR查找重复的号码是一个hack或or俩。 我对此的官方答复是:“我不是在寻找重复的数字,而是在比特集的数组中寻找重复的模式。XOR绝对比ADD更适合操纵比特集”。 :-) 更新:只是在我上床之前很有趣,这是一种“单行”替代解决方案,需要零附加存储(甚至没有循环计数器),仅接触每个数组元素一次,无损且完全不缩放: -) printf("Answer : %d\n", array[0] ^ array[1] ^ array[2] ^ // continue typing... array[999] ^ array[1000] ^ 1 ^ 2 ^ //
  • 这个解决方案有什么问题? (Perm-Missing-Elem codility 测试)(What is wrong with this solution? (Perm-Missing-Elem codility test))
    问题 我已经开始玩 codility 并遇到了这个问题: 给出了一个由 N 个不同整数组成的零索引数组 A。 该数组包含 [1..(N + 1)] 范围内的整数,这意味着恰好缺少一个元素。 你的目标是找到那个缺失的元素。 写一个函数: int solution(int A[], int N); 给定一个零索引数组 A,返回缺失元素的值。 例如,给定数组 A 使得: A[0] = 2 A[1] = 3 A[2] = 1 A[3] = 5 该函数应返回 4,因为它是缺失的元素。 假使,假设: N is an integer within the range [0..100,000]; the elements of A are all distinct; each element of array A is an integer within the range [1..(N + 1)]. 复杂: expected worst-case time complexity is O(N); expected worst-case space complexity is O(1), beyond input storage (not counting the storage required for input arguments). 我已经提交了以下解决方案(在 PHP 中):
  • 程序员代码面试指南---009未排序数组中累加和为给定值的最长子数组长度
    题目描述 给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度。 补充问题1: 给定一个无序数组 arr,其中元素可正、可负、可 0。求 arr 所有的子数组中 正数与负数个数相等的最长子数组长度。 具体实现:程序员代码面试指南—010未排序数组中累加和为给定值的最长子数组系列问题补1。 补充问题2: 给定一个无序数组 arr,其中元素只是 1 或 0。求 arr 所有的子数组中 0 和 1 个数相等的最长子数组长度。 具体实现:程序员代码面试指南—011未排序数组中累加和为给定值的最长子数组系列问题补2。 输入描述 第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出 第二行N个整数表示数组内的数 输出描述 输出一个整数表示答案 示例 输入: 5 0 1 -2 1 1 1 输出: 3 解题思路 一开始使用双指针的滑动窗口来实现,但是发现题目中有负数出现,因此看了原书的解题思路,下面为书中的解题思路: 为了说明解法,先定义 s 的概念,s(i)代表子数组 arr[0…i]所有元素的累加和。 那么子数组arr[j…i] (0≤j≤i<arr.length)的累加和为 s(i)-s(j-1),因为根据定义,s(i)=arr[0…i]的累加和等于 arr[0…j-1]的累加和与 arr[j…i]的累加和相加,又有
  • 判断一个数字数组是否可以分成两个数组,每个数组保存相同的数字之和(Determine whether or not can an array of numbers can be divided into two arrays, with each array holding the same sum of numbers)
    问题 下面是一个代码,用于确定一个数字数组是否可以分成两个数组,每个数组保存相同的数字总和。 例如:{1, 3 ,2, 6}可以分为{6}和{1,2,3},因此返回true而{1,5,7}不能分为两个,平衡数组,因此返回false public boolean canBalance(int[] nums) { for (int i = 0; i < nums.length; i++) { int sum = 0; for (int j = 0; j < i; j++) sum += nums[j]; for (int j = i; j < nums.length; j++) sum -= nums[j]; if (sum == 0) return true; } return false; } 这是codingbat练习的公认答案,我特别不理解这篇文章: for (int j = 0; j < i; j++) sum += nums[j]; for (int j = i; j < nums.length; j++) sum -= nums[j]; 不是迭代通常以 { 开头并以 } 结尾吗? 如果 sum == 0 意味着它可以平衡怎么办? 我尝试在一张纸上用 {1,3,2,6} 数组记下它,总和为 26,它返回 false,很明显 {1,3,2,6} 应该返回 true。
  • 漫画算法题:两数之和与三数之和
    小灰 程序员小灰 今天,小灰把这两道题整合起来,并修改了其中的细节问题,感谢大家的指正。————— 第二天 —————什么意思呢?我们来举个例子,给定下面这样一个整型数组(假定数组不存在重复元素):我们随意选择一个特定值,比如13,要求找出两数之和等于13的全部组合。由于12+1 = 13,6+7 = 13,所以最终的输出结果(输出的是下标)如下:【1, 6】【2, 7】小灰想表达的思路,是直接遍历整个数组,每遍历到一个元素,就和其他元素相加,看看和是不是等于那个特定值。第1轮,用元素5和其他元素相加:没有找到符合要求的两个元素。第2轮,用元素12和其他元素相加:发现12和1相加的结果是13,符合要求。按照这个思路,一直遍历完整个数组。————————————让我们来具体演示一下:第1轮,访问元素5,计算出13-5=8。在哈希表中查找8,发现查不到:第2轮,访问元素12,计算出13-12=1。在哈希表中查找1,查到了元素1的下标是6,所以元素12(下标是1)和元素1(下标是6)是一对结果:第3轮,访问元素6,计算出13-6=7。在哈希表中查找7,查到了元素7的下标是7,所以元素6(下标是2)和元素7(下标是7)是一对结果:按照这个思路,一直遍历完整个数组即可。public class FindSumNumbers { public static List<List<Integer>