`
jigloo
  • 浏览: 6209 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

[Python]华为面试题,交换两个数组的元素使之总和的差值最小。

阅读更多
这是个NPC问题,所以就用穷举发了,在这里给出了一个用python的itertools的解法,个人认为比较简洁。
import itertools

def funcProduct(a, b):
    for c in itertools.permutations(b):
        for d in itertools.product(*[list(itertools.permutations(x)) for x in zip(a, c)]):
            yield zip(*d)

a = [1,2,3,4]
b = [5,6,700,800]
print min(funcProduct(a,b), key=lambda x:abs(sum(x[0])-sum(x[1])))
分享到:
评论
8 楼 flysunmicro 2011-03-24  
合并,排序
7 楼 liuningbo 2011-03-24  
看看写了个 ,实现不需数组长度一致,复杂度O(n^2),求好的算法
   
   /**  arr1={1,2,3};  
     * arr2={22,33,44,55};  
     * 交换两个矩阵数据  
     */  
    public  void exchange(){   
        int index=0;           
        int len=arr1.length;   
        int currMinus=getMinus();          
        while(true){               
            for (int i = 0; i < arr2.length; i++) {   
                echangeMatrix(index,i);//交换值   
                if(currMinus>getMinus()){   
                    currMinus=getMinus();//一次循环中找到最小minus的                 
                }else {   
                    echangeMatrix(index,i);//若不是则不交换,即再换同一位置一次   
                }                  
            }   
            index++;   
            if(index>=len){   
                break;   
            }   
        }   
           
    }   
    private void echangeMatrix(int index,int des){   
        int temp=0;   
        temp=arr1[index];   
        arr1[index]=arr2[des];   
        arr2[des]=temp;   
    }   
    /**计算和  
     * ryuuninbou  
     * @return     int  
     */  
    private  int getMinus(){   
        int sum1=0;   
        int sum2=0;   
        for (int i = 0; i < arr1.length; i++) {   
            sum1+=arr1[i];   
        }   
        for (int i = 0; i < arr2.length; i++) {   
            sum2+=arr2[i];   
        }   
        return Math.abs(sum1-sum2);   
    } 
6 楼 jackra 2011-03-24  
jackra 写道
我个人意见:
先重排所有数组元素到管道
然后分别对2个数组中最小的一组追加当前最小数值.
另外,使用数组效率不好
最好用链表来做

本人不太懂数学,不清楚有什么具体的解法,最少我是没举证出这样不合理的例子,希望大家集思广益.


有个问题,均等树组下,这样的情况貌似问题不大,非均等的情况貌似要用大的树组里第2大元素和小树组里的最小元素交换.
5 楼 jackra 2011-03-24  
我个人意见:
先重排所有数组元素到管道
然后分别对2个数组中最小的一组追加当前最小数值.
另外,使用数组效率不好
最好用链表来做

本人不太懂数学,不清楚有什么具体的解法,最少我是没举证出这样不合理的例子,希望大家集思广益.
4 楼 ggzwtj 2011-03-21  
chenhao112358 写道
如果不要求最有解,可以直接遍历一遍数组,然后比较sum大小和a[i],b[i]大小,看是否交换,就OK 了。
如果需要求最优解,那么就可以先弄个二维数组,记录两个数组的差值表,然后比较sum差值,再去匹配差值表,看需要交换哪几个。

二维数组怎么记录信息?记录对应的位置的两个数是否交换过吗?
3 楼 ggzwtj 2011-03-21  
楼主有用过背包算法,就是传说中的小偷想偷东西,但是包包的容量是有限的,拿那些东西才能取得最多的东西。

其实可以换个角度想问题,就可以把楼主的问题转换成背包问题了:
如果想让两个数组的和之差最小,这不就是让两个数组的和都非常接近总和的一半!当然很多情况下是不能是得两个数组的和相等,都等于总和的一半。

如果不想等的话,必然有一个数组的和是小于总和一半的。我们要做的就是怎么让这个小的部分最接近总和的一半。

所以,这个问题应该可以转化成0-1背包问题,而这个包的大小就是所有数总和的一半,最后我们要求的是用一定量的数字怎么把这个包装得最满。

所以,这不是一个NP问题。

ps:如果我对楼主的描述没有理解错的话。:)
2 楼 chenhao112358 2011-03-21  
如果不要求最有解,可以直接遍历一遍数组,然后比较sum大小和a[i],b[i]大小,看是否交换,就OK 了。
如果需要求最优解,那么就可以先弄个二维数组,记录两个数组的差值表,然后比较sum差值,再去匹配差值表,看需要交换哪几个。
1 楼 dabaosod011 2011-03-19  
楼主你是新来的吧,这种贴还是算入门水准,给你投了新手贴了。
>>> a = [1,2,3,4]
>>> b = [5,6,700,800] 
>>> import itertools
>>> min(itertools.combinations(a+b, len(a+b)/2), key=lambda x:abs(sum(x)-sum(a+b)/2))
(4, 5, 6, 700)

相关推荐

    华为-华为od题库练习题之整型数组合并.zip

    【描述】:“华为_华为od题库练习题之整型数组合并”描述了这个压缩文件的内容,即一系列的题目,这些题目集中于如何合并两个或多个整型数组。在编程领域,数组合并是一个常见的问题,尤其是在处理数据结构和算法时...

    经典华为面试题,大家不要错过哦

    【华为面试题】是本文的核心话题,这通常指的是华为公司在招聘过程中可能会问到的问题,涵盖了硬件和软件领域,反映了华为对求职者技能和知识的全面要求。这些面试题旨在评估候选人在技术理解、问题解决、逻辑思维...

    软通动力外派华为面试题

    综合上述分析,软通动力外派华为面试题涵盖了IT行业的多个核心领域,包括数据类型理解、字符串处理、数据库设计以及面试技巧准备。对于希望进入或已在IT行业工作的专业人士来说,深入理解和掌握这些知识点是提升自身...

    Python后端面试题手册集锦关于Python的面试题23页BAT大厂互联网面试题.pdf

    Python后端面试题关于Python的面试题23页BAT大厂互联网面试题.pdf,Python语言特性,操作系统相关,数据库相关,计算机网络相关,编程题。阿里,腾讯,百度,华为,网易,字节,头条,阿里云,腾讯云,京东,饿了么...

    基于Python的华为OD算法面试题-Huawei-OD-Python-master

    基于Python的华为OD算法面试题——Huawei-OD-Python-master。 本项目主要基于Python语言,使用很多Python语言的标准库,希望大家能通过题目,更好地熟悉Python语法,并灵活运用语法特性。 在推荐资料部分,给出了...

    华为od社招python开发面试题.docx

    ### 华为OD社招Python开发面试准备及流程解析 #### 一、华为OD模式简介 华为OD(Outsourcing Developer)模式是一种特殊的招聘方式,指的是通过与第三方人力资源外包公司合作,将员工招聘进来,但实际上这些员工的...

    华为od社招python开发面试题.pdf

    ### 华为OD社招Python开发面试准备及流程解析 #### 一、华为OD模式简介 华为OD(Outsourcing Developer)模式是一种特殊的招聘方式,指的是通过与第三方人力资源外包公司合作,将员工招聘进来,但实际上这些员工的...

    python 华为 od 机试题试题答案.docx

    ### Python华为OD机试知识点详解 #### 一、Python数据类型及特点 Python是一种广泛使用的高级编程语言,因其简洁易读的语法而受到程序员的喜爱。在编写Python程序时,掌握不同数据类型的特性和用途至关重要。 - *...

    面试前的华为Python机考题.zip

    python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 ...

    华为面试经验 华为面试试题

    华为的面试通常包括电话面试、在线测试、技术面试、HR面试和部门经理面试等多个环节。电话面试主要确认基础信息和初步沟通;在线测试多为逻辑分析和编程能力的测试;技术面试则针对具体职位深入考察技术能力;HR面试...

    【免费题库】华为OD机试 - 数组组成的最小数字(Java & JS & Python & C & C++).html

    【免费题库】华为OD机试 - 数组组成的最小数字(Java & JS & Python & C & C++).html

    华为面试试题,各种方面都有

    华为作为全球领先的电信解决方案供应商,其面试涵盖了技术、管理、项目经验、团队合作等多个方面。以下是一些可能出现在华为面试中的核心知识点: 1. **通信技术**:由于华为在通信行业的领导地位,面试中可能会...

    python 华为 od 机试题试题答案.zip

    这个资料对于正在准备华为Python编程相关考试或面试的学员来说具有很高的参考价值。现在,我们将深入探讨其中可能涵盖的Python知识点。 1. **Python基础语法**:这是所有Python学习者必须掌握的部分,包括变量声明...

    华为面试题吐血整理.rar

    这份“华为面试题吐血整理”涵盖了校招面试、软件面试、硬件面试、算法挑战、机考实践以及群面策略等多个方面,旨在全方位提升应聘者的技能和应变能力。以下是对这些知识点的详细解读: 1. **校招面试题**:针对...

    华为OD机试C卷- 数组二叉树(Java & JS & Python).md-私信看全套OD代码及解析

    ### 华为OD机试C卷- 数组二叉树(Java & JS & Python) #### 颈椎题目概述 本题目主要考察的是利用数组来表示二叉树,并且通过深度优先搜索(DFS)的方式寻找从根节点到最小叶子节点的路径。题目描述中给出了非常...

    华为面试试题.rar

    以下将根据"华为面试试题"这一主题,深入探讨可能涉及的多个IT知识点。 一、网络技术 华为在路由器、交换机等领域有深厚的技术积累,面试中可能会涉及OSI七层模型、TCP/IP协议栈、路由协议(如RIP、OSPF、BGP)、...

    python基础教程_(华为内部资料)

    Python拥有庞大的标准库,涵盖了网络、系统、数学、文本处理等多个领域。此外,还有许多优秀的第三方库,如NumPy用于科学计算,Pandas用于数据分析,Matplotlib和Seaborn用于数据可视化。 9. **Python与其他技术的...

    揭秘华为OD机试:如何用Python秒杀面试官的算法题!

    ### 揭秘华为OD机试:如何用Python秒杀面试官的算法题! #### 核心知识点概述 本文旨在帮助即将参加华为OD技术面试的候选人准备面试中的算法题部分。通过对几个经典算法题目的深入剖析,包括“两数之和”、“无...

    华为出品-Python基础入门教程-可爱的Python 共86页.ppt

    【Python技术前景】 Python是一种广泛应用于各种领域的高级编程语言,具有强大的解释性、交互性和...华为出品的这个Python基础入门教程,无疑为学习者提供了全面、深入的指导,帮助他们更好地理解和掌握Python编程。

    【免费题库】华为OD机试 - 整型数组按个位值排序(Java & JS & Python & C & C++).html

    【免费题库】华为OD机试 - 整型数组按个位值排序(Java & JS & Python & C & C++).html

Global site tag (gtag.js) - Google Analytics