• [面试tx] 根据上排给出十个数,在其下排填出对应的十个数


    给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数   
    要求下排每个数都是先前上排那十个数在下排出现的次数。   
    上排的十个数如下:   
    【0,1,2,3,4,5,6,7,8,9】

    举一个例子,   
    数值: 0,1,2,3,4,5,6,7,8,9   
    分配: 6,2,1,0,0,0,1,0,0,0   
    0在下排出现了6次,1在下排出现了2次,   
    2在下排出现了1次,3在下排出现了0次....   
    以此类推..   

     

    解题思路:关键是理解“要求下排每个数都是先前上排那十个数在下排出现的次数”。

    做以下分析:设总共有n个数,上排a[0...n-1],下排b[0...n-1],。

    1)下排n个数的累加和为n,即b[0]+b[1]+...+b[n-1] = n

    2)ai*bi的累加和也为n,即a[0]*b[0]+a[1]*b[1]+...+a[n-1]*b[n-1] = n

    3)对于b中任意一个元素b[j], 都存在i,a[i] = b[j].

    4)对于b中任意一个元素b[j],都有b[j] >= 0

    5)如果a中存在负数。其在b中出现的次数一定为0. 如果a中数值大于n,则其出现次数也为0.

    6)a中至少有两个非0数值在b中出现的次数非0

     

    a:由1)n > n*b[i],其中b[i]为最小值,则a b中一定均有数值0,否则无解。设a[0] = 0,b[0]为a[0]在b中出现次数。

    b:由于b中一定存在0,则0的出现次数一定大于0,因此b[0]>0 且b[0] < n,b[1...n-1]中至少一个值为0. 非0元素出现的次数一共是n-b[0].

    c:有2)和6)对任意a[i],a[i]*b[i] < n,即b[i] < n/a[i],对所有a[i]>=n/2的元素中,在b中出现的次数必须最多只有1个出现次数不为0,且为1.其余出现次数均为0,即[1, n/2)范围内最多只有n/2-1个元素,故0出现的次数必不小于n/2, [n/2,n)范围内的元素必有一个出现次数为1。因此a数列中也必须有1,否则无解。

    d:有c得在数值范围为(0,n/2)中(假设有x这样的数)出现的次数和s为n - b[0]或n-b[0]-1。其中1出现的次数至少为1(由c得)。又如果1出现的次数为1,则1出现的次数已经为2,故1出现的次数必大于1.设为x,则x出现的次数至少为1,而x>1,如果x出现的次数大于1,那么必须要有其他数出现的次数为x,这样无法收敛。故x出现的次数只能为1,1出现的次数只能为2.

     另外:(感谢coolria提出)如果上排数列中无0,则下排数列全是0,是其唯一解。

    结论:

    1)如果上排数列中有0,此时如果上排数列中无0,1,2,n-4这四个数,则下排数列无解;否则下排数列中0出现的次数为n-4;1出现的次数为2;2出现的次数为1;n-4出现的次数为1;其余为0。

    2)如果上排数列中无0,则下排数列全0,是其唯一解。

  • 相关阅读:
    Android笔记之调用系统相机拍照
    Android笔记之RoundedImageView
    Java笔记之public、protected、default和private
    Android笔记之ExpandableListView(悬浮吸顶Demo)
    Android笔记之Fragment中创建ViewModel的正确方式
    Android代号、版本及API级别之间的对应关系
    【Phabricator】教科书一般的Phabricator安装教程(配合官方文档并带有踩坑解决方案)
    【Ansible】记一次技术博客害死人的经历——ansible模板变量注入探究
    【linux杂谈】遇到REMOTE HOST IDENTIFICATION HAS CHANGED怎么办?
    【linux杂谈】在SSH连接中,openssh如何解决'Connection refused'错误?
  • 原文地址:https://www.cnblogs.com/robbychan/p/3787019.html
Copyright © 2020-2023  润新知