文档介绍:有一个整数数组,请求出两两之差绝对值最小的值。记住,只要得出最小值即可,不需要求出是哪两个数。(Microsoft) 
方法1:两两作差求绝对值,并取最小,O( n2 )。
方法2:排序,相邻两点作差求绝对值,并取最小,O( nlgn ).
方法3:有没有O( n )的解法?网上有如下解法:
设数组A = { a1, a2, … , an }, 求 s = min( |ai - aj| ), 其中1<= i, j <=n.
设B = { b1, b2, … , bn-1 }, 且 bi = ai – ai+1
即:b1 = a1 – a2, b2 = a2 – a3, b3 = a3 – a4, …
于是有如下规律:
例如:a3 – a5 = ( a3 – a4 ) + ( a4 – a5 ) =b3 + b4
a1 – a6 = b1 + b2 + … + b5
即:ai – aj = bi + … + bj-1
则数组A中任意两个数的差,都可以用数组B中一个字段的和表示。
则原问题可以转换为:
在数组B中,求连续的某一段,使其和的绝对值最小。(只求最小值,不需要知道具体是哪些数)
例如 B = { 1, -2, 3, -1, -9, 7, -5, 6 };
则绝对值最小值为0,具体是{ -2, 3, -1 } 或 {3, -1, -9, 7} 
网上的解法,一般到这里就没下文了。只是简单的提了一下,类似于最大子序列的和。具体怎么做,还要自己想想。
最大子序列和利用DP,可O( n )求解。这题咋做?纠结。
2.        写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?) 
据说此题是,Microsoft的大牛只有了4行代码就给出了答案。
可惜,不知道是怎么写的。自己试着写写,当然可能会不至4行。单纯追求行数,也没什么意义,如果你愿意可以把所有的程序都写成一行。
注意:
1. 处理前导空格
2. 处理正负号
3. 处理进制(16进制、8进制、10进制)
4. 非法字符( 0---9, a---f, A---F)
5. 注意整数的范围,不能溢出 
view plaincopy to clipboardprint?
bool StrToInt( char *pc, long &value )  
{  
    //去掉前导空格   
    while( ( *pc==' ' || *pc=='\t' ) && *pc != '\0' ) pc++;  
    if( *pc == '\0' )   return false;  
  
    //处理正负号   
    int sign = 1;  
    if( *pc == '+' || *pc == '-' )  
    {  
        if( *(pc+1) =='\0' ) return false;  
        if( *pc == '-' ) sign = -1;   
        pc++;  
    }  
  
    //处理数值   
    long tmp = 0;  
    while( *pc != '\0' )  
    {  
        tmp *= 10;  
        //++优先级比*高   
        if( *pc < '0' && *pc > '9' ) return false;          
        tmp += ( *pc++ - '0' );  
    }  
    value = tmp * sign;  
    return true;  
}  
3.        给出一个函数来输出一个字符串的所有排列 
方法1:
一个简单的DFS。从后往前不断交互。N个字母求全排列,O( n! )。具体实现,看代码吧。
方法2:
如果不会写递归,也可以利用STL。STL里有一个next_permutation函数。利用这个函数可以返回大于原字符串的下一个字典序列。当字符串为最大字典序列时,函数返回false。这样只要先对原字符串排序,然后不断调用next_permuation即可。
view plaincopy to clipboardprint?
inline void Exchange( char *px, char *py )  
{  
    char tmp = *px;  
    *px = *py;  
    *py = tmp;