zoukankan      html  css  js  c++  java
  • 阿里真题之切片四等分

    题目如下

    对于一个长度为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。

    等我看完并理解这个题目后,已经过去10分钟了……,于是使用最垃圾的暴力循环法草草的写了一遍,结果也是惨不忍睹,通过率只有20%。

    目前的思路是:

    从最左侧和最右侧开始,找到两个点m1,m3使得m1左侧的元素之和等于m3右侧的元素之和,然后再在m1和m3之间找到一个m2点,使得m1和m2之间的元素和等于m2和m3之间的元素和并且等于m1左侧的元素和,如果找不到这个m2,则m1和m3继续往中间移动。

    以下为代码,基本思路应该没问题,但没有做大量数据的测试,不能保证完全正确:

    public class Test01 {
    
    	public static void main(String[] args){
    		//int[] A={2,5,1,1,1,1,4,1,7,3,7};
    		int[] A={10, 2, 11, 13, 1, 1, 1, 1, 1};
    		System.out.println(resolve(A));
    				
    	}
    	static boolean resolve(int[] A){
    		if(A.length<7) return false;
    		int N = A.length;
    		int m1=1;
    		int m3=N-2;
    		int m2;
    		int sum1=A[0];
    		int sum4=A[N-1];
    		int sum2=0;
    		int sum3=0;
    		while(m3-m1>=4){//m1和m3之间至少有三个元素
    			System.out.println("m1:"+m1+",m3:"+m3+",sum1:"+sum1+",sum4:"+sum4);
    			if(sum1>sum4){
    				m3--;
    				sum4=sum4+A[m3+1];
    			}
    			if(sum1<sum4){
    				m1++;
    				sum1=sum1+A[m1-1];
    			}
    			if(sum1==sum4){
    				for(int i=m1+1;i<=m3-3;i++){
    					sum2=sum2+A[i];
    					if(sum2==sum1){
    						m2=i+1;
    						for(int j=m2+1;j<=m3-1;j++){
    							sum3=sum3+A[j];
    						}
    						if(sum3==sum1){
    							return true;
    						}else{
    							continue;
    						}
    					}
    					if(sum2>sum1) break;
    					if(sum2<sum1){
    						continue;
    					}
    					
    				}
    				m1++;
    				sum1=sum1+A[m1-1];
    			}
    		}
    		//
    		return false;
    	}
    
    }
    
  • 相关阅读:
    openwrt 相关文章
    负载均衡相关文章
    Today's Progress
    Rodrigues formula is beautiful, but uneven to sine and cosine. (zz Berkeley's Page)
    Camera Calibration in detail
    Fundamental Matrix in Epipolar
    Camera Calibration's fx and fy do Cares in SLAM
    FilterEngine::apply
    FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)
    gaussBlur
  • 原文地址:https://www.cnblogs.com/wuchaodzxx/p/6490070.html
Copyright © 2011-2022 走看看