/** 请完成下面这个函数,实现题目要求的功能 **/ /** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^ **/ /** * * 对于一个长度为N的整型数组A, 数组里所有的数都是正整数,对于两个满足0<=X <= Y <N的整数,A[X], A[X+1] … A[Y]构成A的一个切片,记作(X, Y)。 用三个下标 m1, m2, m3下标满足条件 0 < m1, m1 + 1 < m2, m2 +1 < m3 < N – 1。 可以把这个整型数组分成(0, m1-1), (m1+1, m2-1), (m2+1, m3-1), (m3+1, N-1) 四个切片。如果这四个切片中的整数求和相等,称作“四等分”。 编写一个函数,求一个给定的整型数组是否可以四等分,如果可以,返回一个布尔类型的true,如果不可以返回一个布尔类型的false。 限制条件: 数组A最多有1,000,000项,数组中的整数取值范围介于-1,000,000到1,000,000之间。 要求: 函数的计算复杂度为O(N),使用的额外存储空间(除了输入的数组之外)最多为O(N)。 例子: 对于数组A=[2, 5, 1, 1, 1, 1, 4, 1, 7, 3, 7] 存在下标 2, 7, 9使得数组分成四个分片[2, 5], [1, 1, 1, 4], [7], [7],这三个分片内整数之和相等,所以对于这个数组,函数应该返回true。 对于数组 A=[10, 2, 11, 13, 1, 1, 1, 1, 1], 找不到能把数组四等分的下标,所以函数应该返回false。 */ /****************************************************/

import java.util.*;public class Solution {/*** 注意:* 1、只删除3个元素,等分为四份。* 2、数组元素为正整数。* 3、疑问:后面又说整数取值范围介于-1,000,000到1,000,000之间?明显混淆视听,看来阿里的题考查阅读与观察啊!* 方法一:* 1、先二等分,去除中间那个元素。至少中间左边还是右边有待考证*此方法有bug** *//*** indexBegin开始索引,indexEnd结束索引。* 在sumArr,与chooseRemove中均计算的是indexBegin<=i<indexEnd的元素。* 元素分布:0至v1-1,v1+1到v2-1,v2+1到N-1* *//**测试用例:* {1,1,1,1,7,1,3,4,1,2,1,5,2,2} true;把7换成10,把4换成1,原式也可等分,但却如下* {1,1,1,1,10,1,3,1,1,2,1,5,2,2} false;* {2,2,5,1,2,1,1,3,1,10,1,1,1,1} false;上面的倒序。看来与顺序无关,算法还是存在问题,此种解法存在问题。** *///方法二**********************************************/*** 从两边开始找,找到之后再找中间* 技巧,注意到只删除3个元素,又因为要第一分组与第四分组相等.* 设等分值为v,第一分组n1与第二分组元素n4个数共为n,则2<=N-3-n<=2v;* 此方问题,能够解决方法一的问题*/static boolean resolve2(int[] A) {int[] re=findValLocate(A);System.out.println("寻找完毕,开始检查: "+Arrays.toString(re));re[2]=checkingFind(A,re[0],re[1]+1,re[3]-1); //减1是由于有4部分,最后一部分至少占用1个位置。System.out.println("检查: "+Arrays.toString(re));int v3=checkingFind(A,re[0],re[2]+1,re[3]);//检查第四部分,的分割点是否为re[3]if(v3==re[3]){return true;}return false;}static int checkingFind(int[] A ,int val,int begin,int end){int s=0;for(int i=begin;i<end;++i){s=s+A[i];if(s==val){//返回要去除那个点。return i+1;}}return -1;}/*返回均分值,与要去除的第一个和第三个位置*/static int[] findValLocate(int[] A){int v1=0,v4=0;for(int i=0,j=A.length-1;i<j;){if(v1<v4){v1=v1+A[i];++i;}else if(v1>v4){v4=v4+A[j];--j;}else{/*验证:2<=N-3-n<=2v*/int m=A.length-3-(i+1+A.length-j);if(m>=2 && m<=2*v1 ){/*这里返回的是去除点的位置,i,j没有加减,是因为以前的操作都让它向后移了一位了,现在指的就是要去除的点*/int re[]={v1,i,0,j};return re;}else{v1=v1+A[i];++i;}}}return null;}//方法二结束**********************************************//方法一(此方有问题)**********************************************static boolean resolve(int[] A) {int v2=chooseRemove(A,0,A.length-1);int v1=chooseRemove(A,0,v2-1);int v3=chooseRemove(A,v2+1,A.length-1);int s1=sumArr(A,0,v1-1);int s2=sumArr(A,v1+1,v2-1);int s3=sumArr(A,v2+1,v3-1);int s4=sumArr(A,v3+1,A.length-1);System.out.println("去除的元素依次是:A["+v1+"]="+A[v1]+" ; "+"A["+v2+"]="+A[v2]+" ; "+"A["+v3+"]="+A[v3]+" ; ");System.out.println("四个部分和是:"+"s1="+s1+" ; "+"s2="+s2+" ; "+"s3="+s3+" ; "+"s4="+s4+" ; ");if(s1==s2&&s3==s4&&s2==s3){return true;}return false;}static int sumArr(int[] A, int indexBegin, int indexEnd){int sum=0;for(int i=indexBegin; i<=indexEnd;++i){sum =sum +A[i];}return sum;}static int chooseRemove(int[] A, int indexBegin, int indexEnd){int ave=sumArr(A,indexBegin,indexEnd)/2;int val=0;for(int i=indexBegin;i<=indexEnd;++i){val=val+A[i];if(val>ave){return i;}}return -1;}//方法一结束**********************************************public static void main(String[] args){/*ArrayList<Integer> inputs = new ArrayList<Integer>();Scanner in = new Scanner(System.in);String line = in.nextLine();while(line != null && !line.isEmpty()) {int value = Integer.parseInt(line.trim());if(value == 0) break;inputs.add(value);line = in.nextLine();}int[] A = new int[inputs.size()];for(int i=0; i<inputs.size(); i++) {A[i] = inputs.get(i).intValue();}*///int[] A={1,1,1,1,7,1,3,4,1,2,1,5,2,2};int[] A={1,1,1,1,10,1,3,1,1,2,1,5,2,2};Boolean res = resolve2(A);System.out.println(String.valueOf(res));}
}

阿里-----数组四等分相关推荐

  1. 阿里17实习生编程-数组四等分

    阿里17实习生编程练习 亮题 对于一个长度为N的整型数组A, 数组里所有的数都是正整数,对于两个满足 0<=X <= Y <N的整数,A[X], A[X+1] - A[Y]构成A的一 ...

  2. 269道各路算法考试题集锦

    1 某编程大赛题(35道题,中等难度) 1.在实际的开发工作中,对于string的处理是最常见的编程任务,本题是要求程序对用户输入的string进行处理,具体要求如下: 1.每个单词的首字母变为大写. ...

  3. 如何用O(n)实现四等分数组

    第一次写博客还有点小紧张.前几天在一个比赛群里看到一道很有意思的算法题,题目如下: 给定一个数组,要求在数组里扣掉3个数后,所得到的4部分字数组的和相等,要求时间复杂度O(n) 题目本身并不难,难在要 ...

  4. spring 数组中随机取几个_准备几个月,面试阿里耗时两周,最终凭借这些知识拿下阿里offer...

    朋友去阿里进行的技术面,历经了二个多小时,面试的是Java开发工程师,出来后立马拿手机记录了面试问的知识点,知识点包括Java基础和高级.spring.多线程.网络.数据库.算法.Redis.分布式. ...

  5. Leetcode刷题100天(阿里云周赛)—查找数组中的所有重复项(哈希)—day42

    前言: 作者:神的孩子在歌唱 大家好,我叫运智 描述 给定一个整数数组,1 ≤ a[i] ≤ n(n = 数组的大小),一些元素出现两次,其他元素出现一次. 找到在此数组中出现两次的所有元素. 示例 ...

  6. next数组_【阿里面试热身题】数组去重(动画展示)

    今天这道双指针题目特征非常明显,就是数据挪移.这类问题,通常需要一个指针扫描全局,确定哪个元素要被挪移,另一个指针用来维护能够接纳元素的地址. 1 举个栗子 给定一个升序排列的数组,请将其中重复的字符 ...

  7. phpcount数组报错_joomla中的PHP错误警告:count():参数必须是实现Countable的数组或对象-问答-阿里云开发者社区-阿里云...

    我正在第一个joomla网页上工作(当前使用的是xampp v3.2.3,php 7.3.2和joomla是3.9.13),我使用的是rocksprocket扩展程序(带有滑块主题,一切都很好),但使 ...

  8. Java 集合(List、Set)与数组(Arr)互转方法及注意事项,难怪《阿里开发手册》会如此重视

    原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重. 前言: 如果你现在正急于解决问题,请立刻.马上拉到本篇最后的[总结],进入"不废话环节". 通过本篇的学习,你将全面掌 ...

  9. 阿里P8都觉得烧脑的是什么数据库 - 绝世好剑(数组的相似约束与实时判定)

    标签 PostgreSQL , rum , tsvector , array , smlar , 相似度 , 内容去重 , 内容筛选 , 转载 , 盗图 , 侵权 , 内容过滤 背景 同一个热点事件, ...

最新文章

  1. 边缘计算 — 与 AI
  2. Java基础23-集合类2(Set接口,Iterator迭代器)
  3. 【KVM系列05】Libvirt 介绍
  4. 目标跟踪从0到1:算法与实践
  5. Hive更换TEZ引擎
  6. linux注册平台驱动,关于Linux驱动的平台注册方式-- platform_driver_register
  7. 【数据结构基础笔记】【队列】
  8. 开发物体识别桌、_科研人员开发突破性的技术,允许盲人识别形状和物体
  9. 你的实力就等于别人对待你的态度
  10. oracle 的变量的定义和赋值
  11. 你还在手写 CRUD?试试 MybatisGenerator,再也不用加班了!
  12. 发那可g10_FANUC系统G10指令的使用.doc
  13. 【数学建模】2017年B题
  14. 那些年Android面试官常问的知识点,快来收藏!
  15. android transact,Android Native层Binder.transact()函数调用 Binder.onTransact() 函数失败分析...
  16. gnuplot入门教程
  17. 计算机应用基础素材,计算机应用基础(Windows XP+Office 2003)、素材和习题答案-王向慧 计算机应用基础...
  18. linux系统下u盘变成只读模式如何修改
  19. 计算机无法建立word文档,(电脑中右键不能新建word和excel文档怎么办)为何电脑无法新建excle...
  20. 手把手教你在Github上建立自己的个人博客网站

热门文章

  1. bash: arpspoof: command not found
  2. STM8L 软件I2C读写操作
  3. Linux如何利用宝塔部署电影网站
  4. python搭建内网网站,python搭建服务器
  5. 开发者说 | 云+AI赋能心电医疗领域的应用
  6. matlab平均值消噪声
  7. 宝藏字幕软件 | PotPlayer
  8. 银行对帐java程序_使用用友软件如何进行银行对账
  9. 超级安全——Python 合成多张图片到PDF格式
  10. 基于JAVA的日期计算器