算法练习:等值首尾和

内容

假设有一个数组x[],它有n个元素,每一个都大于零;称x[0]+x[1]+...+x[i]为前置和,而x[j]+x[j+1]+...+x[n-1]为后置和。试编写一个程序,求出x[]中有多少组相同的前置和后置和。

例如:x[]的元素是3,6,2,1,4,5,2,于是x[]的前置和有以下7个,即3,9,11,12,16,21,23;后置和则2,7,11,12,14,20,23;

于是11,12,23,这3对就是值相同的前置和与后置和。

我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神。。奥,不对就解决了!其实这个系列一直着重练习数组索引的技巧,通过这些技巧可以降低算法的时间复杂度,嘿嘿,这样的练习就要告一段落了,明天开始就是新的旅程了!加油!

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

#include <iostream>
using namespace std;     

int _tmain(int argc, _TCHAR* argv[])
{
    int numOfSameSum(int x[], int x_Length);
    int x[7] = { 3, 6, 2, 1, 4, 5, 2 };
    int num = numOfSameSum(x, 7);
    cout << "等值首尾和的个数为:" << num << endl;
    getchar();
    return 0;
}     

int numOfSameSum(int x[], int x_Length)
{
    int begin_Index = 0;
    int end_Index = x_Length - 1;
    int begin_Sum = x[begin_Index];
    int end_Sum = x[end_Index];
    int sameSum = 0;
    while (begin_Index < x_Length && end_Index >= 0)
    {
        if (begin_Sum == end_Sum)
        {
            sameSum++;
            begin_Index++;
            end_Index--;
            begin_Sum += x[begin_Index];
            end_Sum += x[end_Index];
        }
        else if (begin_Sum > end_Sum)
        {
            end_Index--;
            end_Sum += x[end_Index];
        }
        else
        {
            begin_Index++;
            begin_Sum += x[begin_Index];
        }     

    }
    return sameSum;
}

实验结果:

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, 数组
, int
, 元素
, 一个
, 相同
, 首尾
和后置++
,以便于您获取更多的相关知识。

时间: 2025-01-31 07:29:54

算法练习:等值首尾和的相关文章

《算法基础》——3.10 练习

3.10 练习 3.2.5节"在尾部添加单元格"中给出了在单向链表尾部添加单元格的一个时间复杂度为O(N)的算法.如果使用另一个变量bottom来指向链表最后一个单元格,则可以用O(1)时间向链表尾添加项.写出这样的算法.添加变量后会使在首尾添加项.寻找项.删除项变得怎样复杂?写一个从这样链表中移除项的算法.2.写出一个在整数组成的.未排序的单向链表中找出最大项的算法. 3.写出一个在双向链表首部添加一个项的算法.4写出一个在双向链表尾部添加一个项的算法.5.如果把练习3.4的算法与&

算法练习:等值数目

内容:已知两个整数数组f[]与g[],它们的元素都已经从小到大排列好,而且两个数组中的元素都各不相同.例如,f[]中有1,3,4,7,9,而g[]中有3,5,7,8,10.试编写程序算出这两个数组之间有多少组相同的元素.就上例而言,f[2]和g[1]为3是一组:f[4]和g[3]为8是一组.所以共有两组. 经过了前两天的编写,我觉得程序不具有代表性,所以我打算以后把核心算法的部分写出函数的形式,这样看起来更直观. 更多精彩内容:http://www.bianceng.cnhttp://www.b

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助"多关键字排序"的思想来实现"单关键字排序"的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键

折半查找(binary search) 算法示例

折半查找, 又称二分查找(binary search), 需要数组有序(sort), 通过比较数组的中间数据(中心偏向较小的方法), 确定查找值的范围; 直到中值等于查找值, 则查找成功; 如果未成功, 则重置数据, 判断首尾位置的大小, 再进行中值比较; 判断失败, 则数据不存在; 注意: 1. Eclipse无法重定向(redirect)输入文件(file), 只能读入数据; 2. 使用cmd重定向输入文件, 则需要解压"stdlib.jar", 取出相应的class(In, Ou

点在多边形内算法的C语言实现

本文是采用射线法判断点是否在多边形内的C语言程序.多年前,我自己实现了这样一个算法.但是随着时间的推移,我决定重写这个代码.参考周培德的<计算几何>一书,结合我的实践和经验,我相信,在这个算法的实现上,这是你迄今为止遇到的最优的代码. 这是个C语言的小算法的实现程序,本来不想放到这里.可是,当我自己要实现这样一个算法的时候,想在网上找个现成的,考察下来竟然一个符合需要的也没有.我对自己大学读书时写的代码没有信心,所以,决定重新写一个,并把它放到这里,以飨读者.也增加一下BLOG的点击量. 首先

SQL Server三大算法的I/O成本

1. Nested Loop Join(嵌套循环联结) 算法: 其思路相当的简单和直接:对于关系R的每个元组 r 将其与关系S的每个元组 s 在JOIN条件的字段上直接比较并筛选出符合条件的元组.写成伪代码就是: 代价: 被联结的表所处内层或外层的顺序对磁盘I/O开销有着非常重要的影响.而CPU开销相对来说影响较小,主要是元组读入内存以后(in-memory)的开销,是 O (n * m) 对于I/O开销,根据 page-at-a-time 的前提条件,I/O cost = M + M * N,

深入排序算法的多语言实现

 1 排序的基本概念 排序: 所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.其确切定义如下: 输入:n个记录R1,R2,-,Rn,其相应的关键字分别为K1,K2,-,Kn. 输出:Ril,Ri2,-,Rin,使得Ki1≤Ki2≤-≤Kin.(或Ki1≥Ki2≥-≥Kin). 排序的稳定性:当待排序记录的关键字均不相同时,排序结果是惟一的,否则排序结果不唯一.在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方

JAVA实现KMP算法理论和示例代码_java

一.理论准备KMP算法为什么比传统的字符串匹配算法快?KMP算法是通过分析模式串,预先计算每个位置发生不匹配的时候,可以省去重新匹配的的字符个数.整理出来发到一个next数组, 然后进行比较,这样可以避免字串的回溯,模式串中部分结果还可以复用,减少了循环次数,提高匹配效率.通俗的说就是KMP算法主要利用模式串某些字符与模式串开头位置的字符一样避免这些位置的重复比较的.例如 主串: abcabcabcabed ,模式串:abcabed.当比较到模式串'e'字符时不同的时候完全没有必要从模式串开始位

JS及PHP代码编写八大排序算法_javascript技巧

从学习数据结构开始就接触各种算法基础,但是自从应付完考试之后就再也没有练习过,当在开发的时候也是什么时候使用什么时候去查一下,现在在学习JavaScript,趁这个时间再把各种基础算法整理一遍,分别以JS和PHP语法的方式编写代码.1.冒泡排序原理:临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束时间复杂度:平均情况:O(n2)  最好情况:O(n) 最坏情况:O(n2)空间复