zoukankan      html  css  js  c++  java
  • 将兔子均匀的放入笼子;保证每个笼子中的兔子重量一致

    算法题;

    题目介绍:

      某朋友去面试,面试官出的面试题;

    题目:
    现在需要将总数和各自重量都已知的兔子放进 n 个笼子中,将所有兔子全部放进去后,最终每个笼子的重量需要相同
    请实现一个函数,输入 包含了所有兔子重量的数组 和 笼子的数量,输出 最终每个笼子的重量是否能够相同
    提示:兔子重量为正整数,且不许杀兔子
    数组长度不超过15
    
    测试用例1:
    输入:[2, 2, 3, 3, 5], 3
    输出:true
    解释:5只兔子按以下方式放入3个笼子后,笼子重量相同:[2, 3]、[2, 3]、[5]
    
    测试用例2:
    输入:[3, 5, 5, 6, 7], 4
    输出:false
    解释:5只兔子无论怎样分配到4个笼子中,笼子重量都无法相同

    思路一

    利用队列的方式;从大到小相加数据;循环判断。PYTHON版本

    def func(arr,n):
        if n == 1: return True
        if n > 14  or sum(arr) % n != 0: return False
        avg = sum(arr) // n
        if  max(arr) > avg:return False
        arr = sorted(arr)[::-1]
        for i in range(n):
            s = 0
            test_arr = []
            flag = True
            while flag:
                for k,v in enumerate(arr):
                    if (s + v) <= avg :
                        s += arr.pop(k)
                        test_arr.append(v)
                        if s == avg:flag = False
                        break
                if flag and s + arr[-1] > avg :return False
            print(test_arr)
            if i == n - 1 :return True
        return False

    PHP版本

    <?php
    function weight($a,$count){
        if(count($a) > 15 || count($a) < 1 || count($a) < $count || $count < 1){//边界
            return false;
        }
        if($count < 2){
            return true;//一个笼子直接true
        }
        $total = array_sum($a);//求和
        if( $total%$count != 0 ){//总重量除不尽笼子数量
            return false;
        }
        $avg = $total/$count;
        //var_dump($avg);die;
        rsort($a);//数组取降序 从大数字加小数字
        //var_dump($a);die;
        $tmp = 0;
        for( $i=0; $i<=$count-1; $i++ ){
            $flag = true;
            $tmp = 0;
            $tmp_arr = [];
            while ($flag){
                $a = array_values($a);
                foreach ($a as $key=>$value){
                    if($tmp + $value <= $avg){
                        $tmp += $value;
                        unset($a[$key]);//去除加的这个数
                        array_push($tmp_arr,$value);
                        if($avg == $tmp){
                            $flag = false;
                            break;
                        }
                    }
                }
                if($flag && $tmp + $a[$key] > $avg){ //临时加最后一个
                    return false;
                }
            }
            print_r($tmp_arr);
        }
        return true;
    }
    $re =  weight([1,2,6,7,7,9], 2);
    var_dump($re);

    思路二

    创建一个 list; 循环所有兔子搭配的可能;放入list;然后 求和;算出结果;出现次数最多的那个结果;且这个结果 不大于 总的兔子重量除以笼子数; 如果该求和的所有种结果中少于 笼子的数量;说明无法均匀分配到每一个笼子中。

    from itertools import combinations
    
    def combine(temp_list, n):
        '''根据n获得列表中的所有可能组合(n个元素为一组)'''
        temp_list2 = []
        for c in combinations(temp_list, n):
            temp_list2.append(c)
        return temp_list2
    
    def rabbit_arr(list1,jieguo):
        cage_list =[]
        end_list = []
        for i in range(len(list1)):
            if combine(list1, i) != [()]:
                end_list.extend(combine(list1, i))
    
        for i in set(end_list):
            if sum(i)<=jieguo:  # 不可能大于 这个数字 否则就肯定会分不均
                cage_list.append(sum(i))
        # print(cage_list)
        na = max(cage_list, key=cage_list.count)
        inum = cage_list.count(na)
        dictns = {}
        for i in cage_list:
            if cage_list.count(i) == inum:
                dictns[i] = inum
        res =[]
        for k in dictns.keys():
            res.append(k)
        return res
  • 相关阅读:
    zz 通过INFORMATION_SCHEMA.INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS 三个表获取事务与锁的信息
    binlog在并发状态下的记录
    关于mysql的metadata lock
    测试相关
    数组
    方法、递归算法
    顺序、选择、循环结构
    Scanner
    包机制、javadoc
    变量、常量
  • 原文地址:https://www.cnblogs.com/rianley/p/15565715.html
Copyright © 2011-2022 走看看