论坛首页 招聘求职论坛

最新的百度笔试题

浏览 13795 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-10-26  
izat 写道
chinpom 写道

  LZ那样求幂a^b结果的最后三位数的话,就算是long型都会很快越界的。比如 20^15 就已经超过64位有符号的最大long值了,而且大量的乘法的效率低。原问题的形式可以用 x^y mod N 来表示,这在RSA加密算法中是属于基础的准备算法,可以这样来求:

public class PowerQuestion {

	public static int modeXp(int x, int y, int n) {
		if (y == 0)  return 1;

		int z = modeXp(x, y >> 1, n);  //把y除以2并取整
		if ((y & 1) == 0) {  //如果y为偶数
			return (z * z) % n;
		} else {
			return (x * z * z) % n;
		}
	}

	public static void main(String[] args) {
		System.out.println(modeXp(9, 9, 1000));
	}
}

  假设N为 x,y,n 三个数中最长的二进制位数,则算法的时间复杂度为O(N^3)。

 

 

lz的解法不会越界的吧 - -# 可以优化倒是肯定的

 

public static int foo(int a, int b) {
	a = a % 1000;
	int res = a;
	int i = 1;
	for (; i * 2 < b; i *= 2) {
		res *= res;
		res %= 1000;
	}
	for (; i < b; i++) {
		res *= a;
		res %= 1000;
	}
	return res;
}
 

 

是不会越界的,没看清楚,还以为LZ是先全部相乘的。

0 请登录后投票
   发表时间:2010-10-26  
2.仅用O(1)的空间复杂度,把int数组分为2部分,奇数靠左,偶数靠右

考查的快速排序算法,只不过比较的不是大小而是奇偶
while(back>front)
  front:从前往后遍历数组,遇到奇(偶) 停下
  back:从后往前遍历数组,遇到偶(奇) 停下
  if back>front
     交换数组中front,back位置数据, back--,front++
0 请登录后投票
   发表时间:2010-10-26  
3.判断一个括号字符串是否正确匹配,比如什么({})<[(())]>之类的
我答的用了编译原理的递归向下法

表达式求解的一部分,,记得可以用栈的方式解决,(用2个栈)

算法(算法题我都有瞎做的成分,就不写我的解法了)
1.写个函数用于对变形的递增数组进行二分查找,比如这样的[7, 8, 9, 1, 2, 3]从1开始循环地看是递增的,但事先你不知道从哪一位开始递增。并且分析时间复杂度。

题意不明确
变形的递增数组是不是1次变形[7, 8, 9, 1, 2, 3] 还是有可能多次变形[7, 8, 9, 4, 5, 6,1, 2, 3]
另外是不是还有混合方式 [7 ,10 ,12, 8 ,9 ,11 ,1 ,2 ,3]

1).第一种情形,且查询量小:可以直接用二分法查找,比较的时候会发生状态转移

2).做预处理,建立索引(或排序)
0 请登录后投票
   发表时间:2010-10-26  
yymt 写道
2.仅用O(1)的空间复杂度,把int数组分为2部分,奇数靠左,偶数靠右

考查的快速排序算法,只不过比较的不是大小而是奇偶
while(back>front)
  front:从前往后遍历数组,遇到奇(偶) 停下
  back:从后往前遍历数组,遇到偶(奇) 停下
  if back>front
     交换数组中front,back位置数据, back--,front++

一个back,一个front,空间复杂度就是O(2)!
交换两个数的位置,一般也需要用到临时存储变量吧!这点好像没细说吧!
虽然可以用a+b;a-b;a-b来减少个临时变量
0 请登录后投票
   发表时间:2010-10-26  
bachelor007 写道
yymt 写道
2.仅用O(1)的空间复杂度,把int数组分为2部分,奇数靠左,偶数靠右

考查的快速排序算法,只不过比较的不是大小而是奇偶
while(back>front)
  front:从前往后遍历数组,遇到奇(偶) 停下
  back:从后往前遍历数组,遇到偶(奇) 停下
  if back>front
     交换数组中front,back位置数据, back--,front++

一个back,一个front,空间复杂度就是O(2)!
交换两个数的位置,一般也需要用到临时存储变量吧!这点好像没细说吧!
虽然可以用a+b;a-b;a-b来减少个临时变量


O(1)表示常数空间的意思吧,,并不是指用1个变量吧...
0 请登录后投票
   发表时间:2010-10-26  
yymt 写道

O(1)表示常数空间的意思吧,,并不是指用1个变量吧...


你是对的
0 请登录后投票
   发表时间:2010-10-26  
fwoncn 写道

1.0<a,b<100000,求幂a^b结果的最后三位数


1.用一个数组a来存放每次乘法得出结果的后三位
2.每次做乘法运算的时候,跟数组进行对比,不存在继续运算,如果存在,进入步骤3
3.记录对应的下标index和数组的大小length,a[index]和a[length-1]之间是循环出现的
4.(省略......)
总结:最多做1000次乘法运算,进行的比较次数最多为n*logn(n<=1000)
0 请登录后投票
   发表时间:2010-10-26  
都是大牛啊
0 请登录后投票
   发表时间:2010-10-26  
参考izat的思路,再做成递归,应该可以再减少一些计算量:

public class Tst4 {
public static void main(String[] args) {
System.out.println(cal(3,10,1000));
}
public static int cal(int a, int b, int div){
a = a % div;
if(a == 0){
return 0;
}
return calMode(a, b, div);
}
public static int calMode(int a, int b, int div){
if(a == 1 || b==0){
return 1;
}
if(b == 1){
return a;
}
int result = a;
int i=2;
for(; i<=b; i*=2){
result *= result;
result %= div;
}
i/=2;
return (result * calMode(a, b-i, div)) % 1000;
}
}
0 请登录后投票
   发表时间:2010-11-18  
    
    //Get a^b last 3 digit.
    public static int powerLast3(int a, int b)
    {
        int result = getLast3(a);
        for(int i=0; i<b-1; i++)
        {
            result *= getLast3(a);
            result = getLast3(result);
        }
        
        return result;
    }
    //Get x last 3 digit.
    public static int getLast3(int x)
    {
        return x%1000;
    }

符号匹配判断:
   
    public static boolean isMatched(String src)
    {
        List<Character> stack = new ArrayList<Character>();
        for(int i=0; i<src.length(); i++)
        {       
            char x= src.charAt(i);
            if (stack.size() > 0) {
                if (isCharMatched(stackTop(stack), x)) {
                    stack.remove(stack.size() - 1);
                    continue;
                }
            }
            
            stack.add(x);
        }
        
        if(stack.size()==0)
            return true;
        
        return false;
    }

    private static char stackTop(List<Character> stack) {
        return ((char)stack.get(stack.size()-1));
    }
    private static boolean isCharMatched(char src, char target)
    {
        if(src=='<' && target=='>')
            return true;
        if(src=='(' && target==')')
            return true;
        if(src=='[' && target==']')
            return true;
        if(src=='{' && target=='}')
            return true;
        
        return false;
    }

二分查找
 public static int binarySearch(int[] src, int x)
    {
        int base = base(src);
        
        int leftIndex = 0;
        int rightIndex = src.length-1;
        
        while(leftIndex <= rightIndex)
        {
            int m = src[l2p((leftIndex + rightIndex)/2, base, src.length)];
            if(m==x)
                return l2p((leftIndex+rightIndex)/2, base, src.length);
            if(x<m)
            {
                rightIndex = (leftIndex+rightIndex)/2-1;
            }else {
                leftIndex  = (leftIndex+rightIndex)/2+1;
            }
        }
        
        return -1;
    }
    
    public static int l2p(int index, int base, int size)
    {
        return (index+base)%size;
    }
    
    /**
     * @param src
     */
    private static int base(int[] src) {
        int left=0, right=src.length-1;
        while(left<right-1)
        {
            if(src[(left+right)/2] >= src[left]) {
                left = (left+right)/2;
            }else
            {
                right = (left+right)/2;
            }
        }
        
        return left + 1;
    }

0 请登录后投票
论坛首页 招聘求职版

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