• 【阿里笔试1】 把一个数组分成四份,三个分割点不算进求和中,使得每份的和要相同。


    {2,5,1,1,1,1,4,3,7,5,7} 比如这数组,分为四份,每份的和相同,分割点不算,分为{2,5} {1,1,1,4},{7},{7}.。设计的函数时间复杂度不超过O(n)

    思路:用一个map<前n个数的和,n>记录一下,用一个数组记录一个前n个数的和,然后其实找第一个位置在哪里就行了,后面两个点的位置可以直接依赖这个map和数组计算出来,复杂度O(1)。找第一个点的复杂度O(n).

     1 package test2;
     2 
     3 import java.util.HashMap;
     4 import java.util.Map;
     5 
     6 public class Test4sum {
     7 
     8     public static void main(String[] args){  
     9         int[] input = {2,5,1,1,1,1,4,3,7,5,7};  
    10         int[] sums = new int[input.length];  
    11         Map<Integer, Integer> hashMap = new HashMap<Integer, Integer>();  
    12   
    13         int tmp = 0;  
    14         for (int i = 0; i < input.length; ++i) {  
    15             tmp += input[i];  
    16             sums[i] = tmp;  
    17             hashMap.put(tmp, i);  
    18         }  
    19   
    20         for (int pos1 = 1; pos1 < input.length; ++pos1) {  
    21             int sum = sums[pos1] - input[pos1];  
    22             if (hashMap.containsKey(sum + sums[pos1])) {  
    23                 int pos2 = hashMap.get(sum + sums[pos1]) + 1;  
    24                 if (pos2 < input.length && hashMap.containsKey(sum + sums[pos2])) {  
    25                     int pos3 = hashMap.get(sum + sums[pos2]) + 1;  
    26                     if (pos3 < input.length && sums[sums.length - 1] - sums[pos3] == sum) {  
    27                         System.out.println("result:"+pos1 + "---"+pos2+"----"+pos3);  
    28                         return;  
    29                     }  
    30                 }  
    31             }  
    32         }  
    33     }
    34 }
  • 相关阅读:
    feign远程调用问题
    java8--stream
    feign业务组件远程请求 /oauth/token
    redis实现自增序列
    MySQL数据库 相关知识点
    netty
    spring的启动流程及bean的生命周期
    MethodHandleVS反射
    并发与并行
    关于注解的思考
  • 原文地址:https://www.cnblogs.com/noaman/p/6514749.html
Copyright © 2020-2023  润新知