从论坛上看到一个平衡点的考题,问题如下:
引用
1.平衡点问题
平衡点:比如int[] numbers = {1,3,5,7,8,25,4,20}; 25前面的总和为24,25后面的总和也是24,25这个点就是平衡点;假如一个数组中的元素,其前面的部分等于后面的部分,那么这个点的位序就是平衡点
要求:返回任何一个平衡点
原帖地址:
http://www.iteye.com/topic/600079
跟帖中有人采用了求和,然后从头遍历的方法,马背想换种思路,采用从头尾向中间步进的方法,简单实现了一下,第一版的代码如下:
package org.eric;
/**
* 测试找出平衡点。
* 平衡点:数组中某一个元素,其前面元素的总和和后面的元素总和相等,则此元素为平衡点。
* @author 马背{eric.liu} http://mabei.iteye.com
*/
public class BalanceElement {
public static void main(String[] argc) {
//测试数据:{1, 3, 5, 7, 8, 25, 4, 20}
int[] elements = new int[]{1, 3, 5, 7, 8, 25, 4, 20};
findSomeOneBalance(elements);
}
public static void findSomeOneBalance(int[] elements) {
//判断不合理情况
if (elements == null || elements.length < 3) {
System.out.println("==bad elements ==");
return;
}
int pos = 0; //最终找到的平衡点的位置
int element = 0; //平衡点的值
int n = elements.length; //当前判断剩余的元素,初始值为元素总长度
int headPos = -1; //循环判断中头部元素位置
int tailPos = elements.length; //循环判断中尾部元素位置
int head = 0; //头部值的累加和
int tail = 0; //尾部值的累加和
boolean headStep = true; //头部累加在循环判断中下一步是否前进
boolean tailStep = true; //尾部累加在循环判断中下一步是否前进
//循环判断
do {
if (headStep) {
head += elements[++headPos];
n--;
}
if (tailStep) {
tail += elements[--tailPos];
n--;
}
if (head < tail) {
headStep = true;
tailStep = false;
} else if (head > tail) {
headStep = false;
tailStep = true;
} else {
pos = headPos + 1;
element = elements[pos];
}
} while (n > 1);
//输出结果
if (pos != 0) {
System.out.println("==find balance element pos is:" + pos
+ ",and value is:" + element);
} else {
System.out.println("==can't find balance element ==");
}
}
}
此实现马上就发现有重要的bug,当head和tail相等的时候,中间可能还有不止一个元素,即只是相等不能作为判断平衡点的唯一标准,修改之后,第二版程序如下:
if (head < tail) {
headStep = true;
tailStep = false;
} else if (head > tail) {
headStep = false;
tailStep = true;
} else if(n==1) { //注意此处n==1的判断
pos = headPos + 1;
element = elements[pos];
}
考虑到一些特殊情况,例如:数组中可能存在多个平衡点、两个平衡点相邻等,进一步修改到第三版:
if (head < tail) {
headStep = true;
tailStep = false;
} else if (head > tail) {
headStep = false;
tailStep = true;
} else if (n == 1 || n == 0) { //n=0时代表两个平衡点相邻
pos = headPos + n; //+n取代固定+1,平衡点相邻的时候,总是取靠近head的
element = elements[pos];
}
最后针对上面这个版本,马背测试了一些模拟数据,暂时没有发现问题:
- {1,1,1,1,2,1}
- {1, 1, 0, 0, 1, 1}
- {1,2,0,2,1}
附最后第三版源代码:
分享到:
相关推荐
英语音标简记法是学习英语发音的重要工具,它帮助我们准确地读出单词,提升听力和口语能力。本文将详细介绍几种常见的英语音标简记方法,并通过举例帮助理解。 首先,我们来看“去尾法”。这种方法适用于那些以元音...
### 练习简记第一期知识点总结 #### 练习1——聚函数 **题目描述:** 本题考察了SQL语言中的聚合函数及其使用规则。具体来说,题目给出了一条SQL查询语句,并询问该语句是否合法以及其含义。 **SQL语句:** ```...
简记个人博客网站源码为博主现有博客网站,前端采用LayUI框架,此分享版本为asp + access。所有功能齐全,欢迎使用。 使用方法:上传至空间或服务器,通过IIS发布网站即可。 演示地址:...
497476974884240简记.apk
【USACO课文学习简记1】 USACO(USA Computing Olympiad)是美国计算机奥林匹克竞赛,旨在培养高中生的编程和算法能力。这篇学习简记主要涵盖了四个章节,分别是Ad Hoc Problems(杂题)、Complete Search(完全...
中考知识要点简记归纳之人教版初一数学知识点总结.pdf
本文将围绕“Java字符集编码简记”这一主题,深入探讨相关知识点,并结合标签“源码”和“工具”,探讨在实际开发中如何运用和处理字符编码问题。 首先,我们需要理解字符集的概念。字符集是一系列符号的集合,例如...
【简记个人博客网站源码 v2.10.01.rar】是一个包含个人博客网站完整源码的压缩包,版本号为v2.10.01,它主要用于搭建和自定义个人博客平台。这个源码可能由前端界面、后端服务器逻辑以及数据库结构组成,适用于那些...
七年级英语音标简记法PPT教案.pptx
这篇简记涵盖了计算机组成原理中的多个重要知识点,主要包括程序控制I/O、中断嵌套、内存层次结构、平均访问时间计算、磁盘容量计算、指令格式设计、存储器组织、数据依赖性、指令流水线以及缓存操作。 1. **程序...
【知识点详解】 1. 盐类的溶解性规律: ...这些简记规律和知识点是高中化学学习的基础,对于理解和解决化学问题至关重要。理解并熟练掌握这些规则有助于提升解题能力,并为大学化学学习打下坚实基础。
这篇博客文章标题为“2013-6-3珠海移动暑假实习面试简记”,从标题我们可以推测,本文作者分享了自己在2013年6月3日参加珠海移动公司暑假实习面试的经历和感悟。这是一篇关于求职经验、面试技巧以及可能遇到的问题的...
然而,这种方法只适用于二维或三维问题,对于高维问题则需要依赖数值计算方法,如单纯形法或内点法。 在实际应用中,构建正确的线性规划模型至关重要。选择合适的决策变量,确保目标函数和约束条件都是线性的,是...
高中历史之历史百科简记美国“飞虎队”在云南素材
这篇简记可能是关于如何整合这两个工具以实现对数据库活动的透明化监控。 首先,我们需要理解log4jdbc的工作原理。它是一个JDBC驱动的代理,可以拦截并记录所有的SQL查询、执行时间、结果集等信息。而log4j2则负责...
本文将深入解析这两个类的功能、用法以及相关知识点。 首先,Pattern类是Java.util.regex包下的一个类,它代表了一个正则表达式模式。你可以通过`Pattern.compile(String regex)`方法编译一个正则表达式字符串,...
综上所述,文档中提到了运筹学、线性规划、目标规划、灵敏度分析、对偶问题、动态规划等多个学科的知识点和概念,同时也涉及到了求解方法、题型要求、具体算法以及考试和作业的准备策略。这些内容对于学习运筹学和...