1.一串无序的N个数:a1,a2,a3.....an,要求经过最简单的操作,形成另外一个串,仍然包含这些数,b1,b2,b3....bn,并且b1<=b2>=b3<=b4>=b5...
简单的方法就是一次比较相邻的两个数,如果不符合条件,则交换位置,空间O(1),时间O(n)
也可以排序,然后分成相等的前后两个子串,每次都分别从小的子串和大的子串去除一个数字组成符合条件的子串
2.有N个元素(不一定是整数),若存在某一个元素的出现次数在一半以上,则称之为“众数”,先给一串N个元素,问怎么快速并且节省时间地判断出众数是否存在,如果存在,找出这个数
我能想到的方法是对N个元素做排序,然后比较头,中,尾的三个元素,以此判断众数是否存在,并且可以知道哪个数是众数,O(n2)
不过还有更好的方法,众数如果存在,必然只有一个,可以记录下众数的候选者X和它的计数,遍历子串,拿到一个元素A,若果A==X,则X计数++,如果A!=X,X的计数--,若计数变为-1,则用当前的A替换X,计数重置为1.。。遍历完后确定众数,O(n)
3.给定两个排好序的实数数组a[]和b[],如果对两个数组进行合并,则会产生一个新的数组,这个数组会有一个中位数(排在数组中间的那个数),要求使用a[]和b[]找出那个数
取a[]的中位数x和b[]的中位数y,进行以下的操作:如果x>=y,则留下a[]的前半部分和b[]的后半部分,然后对两个新的数组使用该方法。如果x<y,则留下a[]的后半部分和b[]的前半部分,然会对两个新的数组使用该方法,时间复杂度为O(logn)。
4.宽度为m的河两岸分别有两个村庄A 和B,欲在河上架一痤桥,使桥垂直于相互平行的两岸,试确定桥的位置,使得从A到B所用的总路程是最短的。若A、B到岸边的垂直距离分别为a、b,A到B的水平距离为c,求出这个最短距离。
解:过B作BF垂直于河岸,垂足为F,在BF上取BC=m,连接AC,交河对岸于D,则D点即为桥的一个端点,作DE垂直于河岸,则DE即为桥的位置。AD+DE+EB即为所求的最短距离。下边给予证明。∵DE‖=BC,∴四边形DEBC是平行四边形,DC=EB,AD+EB=AD+DC=AC。设D1为岸上D以外的任意一点,则A到B的距离为AD1+D1E1+E1B。又如上可知,D1C=E1B,∴AD1+E1B=AD1+D1C。而在△ACD1中,由于两边之和大于第三边,就有AD1+D1C>AC。因此,AD+DE+EB是距离最小的线段。
又如条件知,AG=c,GC=b-m+m+a=a+b,所以,AC=√[(a+b)^+ c^],因此,最小距离=AC+DE=√[(a+b)^+ c^] +m.