传说中的华为Python笔试题——两等长整数序列互换元素,序列和的差值最小(修正)

有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

1. 将两序列合并为一个序列,并排序,得到sourceList
2. 拿出最大元素Big,次大的元素Small
3. 在余下的序列S[:-2]进行平分,得到序列max,min
4. 将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。

如下,提供递归版本和迭代版本的解体思路:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#########################################################################
# File Name: minDistance.py
# Author: lpqiu
# mail: [email protected]
# Created Time: 2014年10月27日 星期一 05时19分45秒
#########################################################################

# recusive version
def minDist(sortedList):
    if not sortedList:
        return ([], [])

    large = sortedList[-1]
    secondLarge = sortedList[-2]

    largeList, smallList = minDist(sortedList[:-2])
    largeList.append(secondLarge)
    smallList.append(large)
    #print(‘LargeList:‘, largeList, ‘SmallList‘, smallList)

    if sum(largeList) > sum(smallList):
        return (largeList, smallList)
    else:
        return (smallList, largeList)

# iteriation version
def minDistIterVer(sortedList):
    largeList, smallList = [], []

    for i in range(0, len(sortedList), 2):
        if sum(largeList) > sum(smallList):
            largeList.append(sortedList[i])
            smallList.append(sortedList[i + 1])
        else:
            largeList.append(sortedList[i + 1])
            smallList.append(sortedList[i])

    if sum(largeList) > sum(smallList):
        return (largeList, smallList)
    else:
        return (smallList, largeList)

def testMain(listA, listB):                     # len(listA) == len(listB) = n
    print("Sorted List: ", sorted(listA + listB))
    largeList, smallList = minDist(sorted(listA + listB))
    print(largeList, smallList, "distance: ", sum(largeList) - sum(smallList))

    largeListIterVer, smallListIterVer = minDistIterVer(sorted(listA + listB))
    print(largeListIterVer, smallListIterVer, "distance: ", sum(largeListIterVer) - sum(smallListIterVer))

if __name__ == "__main__":
    listA = [1,-1,2,3,6,189]; listB = [2,3,4,6,7,123]
    testMain(listA, listB)
时间: 2024-10-01 03:59:47

传说中的华为Python笔试题——两等长整数序列互换元素,序列和的差值最小(修正)的相关文章

[笔试题] 两个有趣的问题

有n瓶粉末,一瓶有毒.有毒的粉末融在水里一小时后水会变蓝.你有一些试管,问最少需要多少时间和多少试管就能确定毒粉末呢?不考虑粉末导入试管的时间. 这道题最基本的想法就是时间换空间或者空间换时间,即n个试管用1小时的时间,或者1个试管用n小时依次试验过来.在实际生产中应该偏向于空间换时间,因为硬性资源可以增加,而程序如果找不到好的优化方法运行时间基本也就定了,所以时间比空间重要的多.但是这两个显然都不是什么好办法.另外一个比较好的解决办法就是二分,把瓶子分两组,花一个小时排除掉一半的瓶子,再花一个

n个数分为两组,两组数的个数尽可能相等,差值最小

题目描述:对于有n个数的数组,分为两组,这两组的数的个数尽可能相等(不超过1),同时两组的数之和的差值最小. 这个题目使用类似0-1背包问题,思路:从k个数中选i个数,求所有可能的和,并把这些和放在flag中用true表示.(k,i,flag见代码) 1 public static void main(String[] args){ 2 int[] arr = {1 , 2 , 3 , 5 , 7 , 8 , 9}; 3 int n = 7; 4 int sum = 0; 5 for(int i

python笔试题1-21

1.如何实现对python列表去重并保持原先顺序 答:再创建一个列表,依次循环原列表元素并判断,若当前元素不在新建列表中,则添加即可 2.现在有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数,生成列表[{'a':'b'},{'c':'d'}] 答: #答案一 test = lambda t1,t2 :[{i:j} for i,j in zip(t1,t2)] print(test(t1,t2)) #答案二 print(list(map(lambda

经典笔试题:两个线程交替打印奇偶数

一.采用对象的wait() notify()方法实现 package com.gaopeng.programming; import java.util.concurrent.TimeUnit; /** * 经典笔试题:交替打印奇偶数 采用对象的wait() notify()方法实现 * * @author gaopeng * */ public class OddEvenThread { private static volatile Integer counter = 0; public s

python中实现两个列表同时输出元素的方法zip

记:这个问题其实曾经在群里向一些同学求教过,但是在后来的写程序的过程,又把这个方法忘记了,所以今天在这里把这个问题说明下,以免下次再犯同样的问题! 假设有两个列表 a = [1,2,3,4,5,], b = [6,7,8,9,10],现在要求分别从这两个列表中输出元素,则可以使用for循环来实现这个功能 程序: for item1, item2 in zip(a, b): print "a:%s, b:%s" %(item1, item2) 结果如下: a:1 ,b:6 a:2 ,b:

交换两个数组的元素使之总和的差值最小

题目描述: 有两个数组a,b,大小都为n,数组元素的值任意整型数,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小. #include "stdafx.h" #include <math.h> #include <time.h> #include <stdlib.h> void print_arr(int a[], int b[], int n) { printf("a: "); for (int

将元素平分成差值最小的两个集合(DP)

现有若干物品,要分成较为平均的两部分,分的规则是这样的: 1)两部分物品的个数最多只能差一个. 2)每部分物品的权值总和必须要尽可能接近. 现在请你编写一个程序,给定现在有的物品的个数以及每个物品的权值,求出按上述规则分成两部分后每部分的权值总和. 输入格式 第一行为一个整数n(1≤n≤200),表示现在有的物品的个数. 以下的n行每行一个整数,表示每个物品的权值(1≤ai≤40). 输出格式 只有一行,包含两个数,即分成的每部分的权值总和,较小的一个值放在前面,两个数用空格隔开. 样例输入 3

python笔试题42-69

42.如何在Python中拷贝一个对象,并说明他们之间的区别    答:Python中有两种拷贝方式,深拷贝与浅拷贝 浅拷贝:用赋值符号(=)即可,内存地址公用,一个改复制对象全都改 深拷贝:用copy模块下的deepcopy方法,每一个拷贝对象都是独立的内存地址 43.谈谈你对Python装饰器的理解 答:装饰器是一个内嵌函数 他能不改变原函数代码的情况下增加其装饰函数的功能 44.Python里的match()与search()区别 答:match是从字符串第一位开始匹配,若第一位不同则找不

python笔试题(三)

1.MySQL有哪些存储引擎,优化MySQL数据库的方法有哪些? MySQL支持的存储引擎有MyISAM,InnoDB,Memory,CSV,Archive 创建索引,使用复合索引,使用短索引,不在列上进行运算,不使用NOT IN操作,不在包含有NULL值得列上加索引 2.WEB开发中session与cookie的作用与区别? cookie通过在客户端记录用户身份的信息,session通过在服务端记录用户身份信息 cookie机制:理论上一个用户的所有请求都应该属于一个会话,由于web程序应用是