输入一个数组,判断能否抽取三个数,余下的数正好以抽取数的位置将原始数组四等分

20 篇文章 0 订阅

今天做了个有意思的题目,分享下。

输入一个数组,判断能否抽取三个数,余下的数正好以抽取数的位置将原始数组四等分。


如下测试用例,抽取红色字,能分四等分。


int[] a = { 2, 5, 1, 1, 1, 1, 4, 1, 7, 3, 7 }; //返回true
int[] b={10,2,11,13,1,1,1,1,1};
int[] c={};
int[] d={1,1,1,5,3,9,1,2,7,2,1}; //返回true
int[] e={1,2,3,4,5,6,7};
int[] f={1,2,3};


代码:

package com.mytest.designpartter;

public class Mytest00001 {

	/**
	 * 
	 */
	public static void main(String[] args) {
		int[] a = { 2, 5, 1, 1, 1, 1, 4, 1, 7, 3, 7 };
		int[] b={10,2,11,13,1,1,1,1,1};
		int[] c={};
		int[] d={1,1,1,5,3,9,1,2,7,2,1};
		int[] e={1,2,3,4,5,6,7};
		int[] f={1,2,3};
		
		System.out.println(fensi(a));
		System.out.println(fensi(b));
		System.out.println(fensi(c));
		System.out.println(fensi(d));
		System.out.println(fensi(e));
		System.out.println(fensi(f));
	

	}

	private static boolean fensi(int[] a) {
		if (a.length < 7 || a==null)
			return false;

		    int i = 0, j = a.length - 1;
		    int i2=0,j2=0;
			long p = a[i], q = a[j];
			
			while (i<j-3){ 
				  if (p < q ) {
					i++;
					p = p + a[i];
				 }
				  if (p > q ) {
					j--;
					q = q + a[j];
				   }
				i2=i;
				j2=j;
				if(p==q){//第一四份相等,检查第二份和第三份是否和一四份相等
					i=i+2;j=j-2;
					long p2=a[i];
					long q2=a[j];
					//检查2,3份是否合乎规范
					while(i<j-2){
						if(p2<q2){
							i++;
							p2=p2+a[i];
						}
						if(p2>q2 && i<j-2){
							j--;
							q2=q2+a[j];
						}
						if(p2==q2 && i<j-2){
							i++;
							p2=p2+a[i];
						}	
						}
					
					if(p2==q2 && p==p2 && i+2==j){//找到
							return true;
							}
						
					if(p2+q2>p+q){//没找到
							j=j2;
							i=i2;
							i++;
							p=p+a[i];
						}
					}
					
				}
		return false;
	}

}

总结:从前往后,从后往前找,先找第一份和第四份,然后找第二和第三份,如果第二三份不成立,需要回溯到第一四份相等的点继续找下个可能的点。







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值