论坛首页 编程语言技术论坛

两道比较复杂的轩辕互动面试题(Python实现)

浏览 31155 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-02-25   最后修改:2010-02-25
tuple = [1,3,5,7,8,25,1,5,7,8,3]#1,3,4,3,3]#1, 1, 3, 5, 7, 8, 25, 4, 20, 1] #(1,3,5,7,8,25,4,20) 

endIn = len(tuple) - 1 
startIn = 0 
startSum = 0 
endSum = 0 
temp = 0 
i = endIn+1

while i > 0: 
    temp = tuple[startIn] 
    end = tuple[endIn] 
    if endSum >= startSum and endIn > startIn: 
        startSum += temp 
        startIn += 1 
    elif endSum < startSum: 
        endSum += end 
        endIn -= 1 
    else: 
        if endSum!=startSum: 
            print 'no found!' 
        else: 
            print 'ok' 
        break;        
    print 'startSum:%s  ' % str(startSum) + str(startIn) + ' endSum:%s ' % str(endSum) + str(endIn)        
    i -= 1

 

 

0 请登录后投票
   发表时间:2010-02-25   最后修改:2010-02-25
yangyi 写道
拙作
package com.blogspot.yiprogs.algorithms;

public class MiddleNum {
	public static void main(String[] args){
		int[] test = {1,2};
		System.out.println("第" + (showNum(test) + 1) + "个数是中间数");
	}
	
	private static int showNum(int[] array){
		int p = 0;
		int q = array.length - 1;
		int lt = array[p];
		int rt = array[q];
		
		if(p+2 > q){
			return -1000000;
		}
		
		while(p+2 != q){
			if(lt < rt){
				p++;
				lt += array[p];
			}else{
				q--;
				rt += array[q];
			}
		}
		return p + 1;
	}
}

支撑点问题
package com.blogspot.yiprogs.algorithms;

import java.util.HashMap;

public class FindDatum {

	public static void main(String[] args) {
		int[] test = {3,4,1,2,3};
		System.out.println(find(test) + "是支撑数");
	}
	
	private static int find(int[] data){
		int tmp;
		float m = (float)data.length / 2;
		HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
		
		for(int i=0;i<data.length;i++){
			if(hm.get(data[i]) != null){
				tmp = hm.get(data[i]);
				if(tmp + 1 >= m){
					hm = null;
					return data[i];
				}else{
					hm.put(data[i], tmp + 1);
				}
			}else{
				hm.put(data[i], 1);
			}
		}
		
		return -1;
	}
}
0 请登录后投票
   发表时间:2010-02-25  
lz代码,有问题啊
0 请登录后投票
   发表时间:2010-02-26   最后修改:2010-02-26
没看全回复,简单说下我的思路

平衡点问题,
1.求所有值的和,并除2,得到sum/2
2.从前往后加,大于sum/2时停止,得到sum_before和最后一个数位置point[n]
3.从停止的地方开始往后加得到sum_after,若相等,则point[n]为平衡点,否则不存在平衡点
int sum;
int sum_before;
int sum_after;
int point;
int[] array = {*,*,*,*,*,*,*,*,*};

public static void main(String[] args) {
    for(int i = 0; i < array.length(); i++) {
        sum += array[i];
    }

    for(int i = 0; sum_before < sum/2; i++) {
        sum_before += array[i];
        point = i;
    }

    for(int i = point + 1; i < array.length() - point; i++) {
        sum_after += array[i];
    }

    if(sum_after == sum_before) {
        syso(point + "is the num");
    } else {
        syso("none");
    }
}

(未经运行,仅供阅读)
0 请登录后投票
   发表时间:2010-02-26  
代码有点小问题,要改改。
0 请登录后投票
   发表时间:2010-02-26  
  只所以不能够计算[1,2,1],是因为我把RETURN条件弄成了balance + 2>length -1,改成balance + 1>length -1就OK了。之所以犯这个错误主要原因是在写的途中改变了算法,没有仔细检查,该检讨,谢谢指正。
0 请登录后投票
   发表时间:2010-02-28   最后修改:2010-02-28
平衡点的scheme实现:
 (define (part-sum lst k) ;列表lst前k个数之和
    (if (and (> (length lst) 0) (> k 0))
        (+ (car lst) (part-sum (cdr lst) (- k 1)))0))

 (define (balanced-point lst)
    (define (balanced-point-helper lst k) 
      ( cond ((>= k (length lst)) 0)
             ((= (part-sum lst k) (part-sum (reverse lst) (- (length lst) (+ k 1)))) k)
             (else (balanced-point-helper lst (+ k 1)))))
    (balanced-point-helper lst 2))


为验证上面代码的正确性,构造如下find-bp过程,随机生成一个长度为200的列表(元素均为小于1000的整数),查找列表的平衡点。若没有平衡点,再生成一个,直到查找到为止。
(define (find-bp lst) 
    (let ([lst (build-list 200 (lambda (x) (random 1000)))])
    (if (= 0 (balanced-point lst ))
        (find-bp '())
       (begin (display lst) 
              (newline)
              (display (balanced-point lst )))
        )))

运行(find-bp '()),大约30秒钟,生成一个有平衡点的列表:
(396 180 786 440 832 236 354 456 532 518 801 402 613 791 502 259 562 629 696 88 460 690 852 594 541 66 572 734 123 435 412 821 884 840 940 978 742 874 104 531 853 684 119 683 951 902 497 446 102 485 424 796 30 379 450 897 276 793 697 79 202 92 687 517 499 992 847 752 868 73 217 32 869 589 82 273 981 528 458 852 841 664 815 876 929 702 615 503 963 326 619 579 226 637 197 355 607 405 156 86 625 336 601 325 108 956 503 219 691 227 285 929 349 7 859 22 95 129 212 504 146 56 628 816 699 138 284 104 825 75 395 823 680 930 776 112 868 351 198 500 437 92 678 837 600 397 999 323 924 828 395 649 342 697 42 429 756 705 546 991 859 336 274 549 442 180 169 475 843 116 885 850 156 394 243 959 16 371 750 319 489 936 259 942 447 987 829 431 428 56 442 84 79 871 163 523 11 975 632 580)
平衡点为91
0 请登录后投票
   发表时间:2010-03-03  
递归做起来很容易的
/**
 * Created by IntelliJ IDEA.
 * User: benlinus
 * Date: 2010-3-3
 * Time: 10:25:44
 *  平衡点:比如int[] numbers = {1,3,5,7,8,25,4,20}; 25前面的总和为24,25后面的总和也是24,
 * 25这个点就是平衡点;假如一个数组中的元素,其前面的部分等于后面的部分,那么这个点的位序就是平衡点
要求:返回任何一个平衡点
 */
public class BalancePoint {
    private int[] numbers;
    private int start;
    private int end;
    
    public BalancePoint(int[] numbers){
        this.numbers = numbers;
        this.start = 0;
        this.end = numbers.length-1;
    }

    public int findBalancePoint(int pos){
        if(pos < end && pos > 0){
            int presum = 0;
            for(int i=0; i<pos; i++){
                presum = presum + numbers[i];
            }
            int postsum = 0;
            for(int i=pos+1; i<=end; i++){
                postsum = postsum + numbers[i];
            }
            if(presum == postsum)
                return pos;
            else
                return findBalancePoint(++pos);
        }else{
            return -1;
        }
    }

    public static void main(String[] args) {
        int number[] = {1,3,5,7,8,25,4,20};
        BalancePoint balancePoint = new BalancePoint(number);
        int pos = balancePoint.findBalancePoint(1);
        if(pos < 0 || pos >= number.length){
            System.out.println("can't find pos");
        }
        else{
            System.out.println("balance point is:"+number[pos]);
        }
    }
}
0 请登录后投票
   发表时间:2010-03-03  
我觉得涉及到算法先把 算法描述一下再写code,因为出题的人主要考的是算法

1 平衡点 就是前后同时遍历求和  复杂度O(N)
2 支配点 可以参考微软的编程之美 的水王问题 利用一个栈来存储临时数据,复杂度也是O(N)
0 请登录后投票
   发表时间:2010-03-03  
汗,我也做过……可惜代码效率太低了
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics