面试题 - 总结

## 
#1.平衡点问题 
#  平衡点:比如int[] numbers = {1,3,5,7,8,25,4,20}; 25前面的总和为24,25后面的总和也是24,25这个点就是平衡点;假如一个数组中的元素,其前面的部分等于后面的部分,那么这个点的位序就是平衡点 
#要求:返回任何一个平衡点 
Java代码   收藏代码
  1. puts "平衡点问题" + "* " * 20  
  2.   
  3. #初始化常量  
  4. numbers = [1357825420]  
  5. len = numbers.size - 1  
  6. head_sum = 0;tail_sum = 0  
  7. head= 0;tail =len  
  8.   
  9. #开始计算  
  10. for i in 0..len  
  11.   (puts "mid is :#{numbers[i]} sum is:#{head_sum}";breakif head_sum.eql?(tail_sum) and head_sum > 0  
  12.   (head_sum += numbers[head];head += 1if head_sum <=tail_sum  
  13.   (tail_sum += numbers[tail]; tail -= 1if tail_sum <= head_sum  
  14. end  


## 
#2.支配点问题: 
#支配数:数组中某个元素出现的次数大于数组总数的一半时就成为支配数,其所在位序成为支配点;比如int[] a = {3,3,1,2,3};3为支配数,0,1,4分别为支配点; 

Java代码   收藏代码
  1. puts "支配点问题" + "* " * 20  
  2.   
  3. h_count = {} #用于存储数量  
  4. h_index = {} #用于存储位置  
  5. Hash  
  6. a = [3,3,1,2,3]  
  7. a.each_index do |i|  
  8.   h_count[a[i]]=0 if h_count[a[i]].nil?    
  9.   h_count[a[i]] += 1  
  10.   h_index[a[i]] = [] if h_index[a[i]].nil?  
  11.   h_index[a[i]] << i  
  12. end  
  13.   
  14. list = h_count.sort {|a,b| b[1]<=> a[1]}  
  15. puts "支配数是:#{list[0][0]} 数量:#{list[0][1]}"  
  16. puts "支配点数:#{h_index[list[0][0]].join(",")}"  



## 
#3.最大公约数,辗转相除法 
Python代码   收藏代码
  1. a,b = 5767,4453  
  2. ... temp = a  
  3. ... while temp:  
  4. ...     temp = a % b  
  5. ...     if temp == 0:  
  6. ...       print b  
  7. ...     else:  
  8. ...         print a,b  
  9. ...           
  10. ...     a = b  
  11. ...     b = temp  

最小公倍数:公式法 
  可以证明,甲、乙两个自然数和它们的最大公约数与最小公倍数有如下关系: 
  甲×乙=最大公约数×最小公倍数因此,可以根据公式: 
  最小公倍数=甲×乙÷最大公约数来求两个数的最小公倍数。 

## 
#4.大数求余 
原理将大数分开计算,按位计算 
23 = 2*10 + 3 
23%n = 2%n*10 + 3%n 

Python代码   收藏代码
  1. d = 1232132131  
  2. f = 7  
  3. mod = 0  
  4. ... for i in str(d):  
  5. ...     mod = mod * 10 + int(i)  
  6. ...     mod = mod % f  
  7. ...     print mod,f  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值