搜狐面试题

1、1到1亿的数字之和?
方法一:分析:两数相加如果有进位,则两数数字之和大于和的各位数字之和。
例如:23+46=69,2+3+4+6=6+9;而97+8=105,9+7+8>1+0+5。
所以,要把1——100000000这样分组:(0,99999999),(1,99999998),(2,99999997)(3,99999996)……(49999999,50000000),共50000000组,还剩下数字100000000。
这样每一组的数字之和都是:9*8=72
总和为:72*50000000+1=3600000001(36亿零1)
方法二:1到1亿的自然数,求所有数的拆分后的数字之和,如286 拆分成2、8、6
思路:递推方法求解:
1.0-9的和为 a1=(0+9)*10/2
2.0-99时:分析共有100个数,十位上有10对0-9,个位上也是10对0-9(讲个位数上填0补充),
此时a2=2*10*(0+9)*10/2;
3.0-999时:共有1000个数,百位上有1000对0-9,十位上有10对0-9,个位上也是10对0-9,
此时a3=3*100*(0+9)*10/2;
依次类推:当位数为n时,有an=n*(10的n-1次方)*(0+9)*10/2;
上述题目答案即为(0-99999999)时:a8=8*(10的7次方)*(0+9)*10/2,然后加1就可以了。
2、有11个点,每两点之间连一条直线,共有48条线,那么这11个点可以组成几个三角形?
3、甲乙丙丁四个人因涉嫌抢劫银行被捕,在闻讯过程中,警察发现其中一个就是罪犯。他们的口供如下:
甲:是丙偷得;
乙:我没有偷;
丙:我也没偷;
丁:如果乙没偷,我也没偷。
其中只有一个人说的是假话,请你判断出哪一个是罪犯。
4、有12个球,外形都一样,其中有一个质量和其他的不一样,给你一架天平,请问最少称几次可以把那个不同的球找出来。
5、将“I came from Beijing.”变成“Beijing. From came I”(以单词为单位倒序,单词后面的符号不变)

#include <iostream>
using namespace std;
void reverse_part(char*,int pBegin,int pEnd);
void reverse(char *str)
{
    //n为字符串长度
    int n=strlen(str)-1;
    reverse_part(str,0,n);
    int pBegin=0,pEnd=0;

    while(str[pEnd+1]){
        if(str[pEnd]!=' ' && str[pEnd]!='\0')
            ++pEnd;
        //找到空格
        else{
            reverse_part(str,pBegin,pEnd-1);
            //如果下一个还是空格
            while(str[pEnd+1]!='\0' && str[pEnd+1]==' ')
                ++pEnd;
            pBegin=++pEnd;
        }
    }
    cout<<str<<endl;
}

void reverse_part(char *str,int pBegin,int pEnd)
{
    char temp;
    for(int i=pBegin;i<=(pEnd-pBegin)/2;++i){
        temp=str[i];
        str[i]=str[pEnd-i];
        str[pEnd-i]=temp;
    }
}

void main()
{
    char str[]="I am a student.";
    reverse(str);
    system("pause");
}
///
// Reverse a string between two pointers
// Input: pBegin - the begin pointer in a string
//        pEnd   - the end pointer in a string
///
void Reverse(char *pBegin, char *pEnd)
{
      if(pBegin == NULL || pEnd == NULL)
            return;
      while(pBegin < pEnd)
      {
            char temp = *pBegin;
            *pBegin = *pEnd;
            *pEnd = temp;
            pBegin ++, pEnd --;
      }
}
///
// Reverse the word order in a sentence, but maintain the character
// order inside a word
// Input: pData - the sentence to be reversed
///
char* ReverseSentence(char *pData)
{
      if(pData == NULL)
            return NULL;
      char *pBegin = pData;
      char *pEnd = pData;
      while(*pEnd != '\0')
            pEnd ++;
      pEnd--;
      // Reverse the whole sentence
      Reverse(pBegin, pEnd);
      // Reverse every word in the sentence
      pBegin = pEnd = pData;
      while(*pBegin != '\0')
      {
            if(*pBegin == ' ')
            {
                  pBegin ++;
                  pEnd ++;
                  continue;
            }
            // A word is between with pBegin and pEnd, reverse it
            else if(*pEnd == ' ' || *pEnd == '\0')
            {
                  Reverse(pBegin, --pEnd);
                  pBegin = ++pEnd;
            }
            else
            {
                  pEnd ++;
            }
      }
      return pData;
}

6、用冒泡法排序。
7、双链表中插入一个节点
8、编写一个Allocator,用来代替new,要求效率和稳定性不低于系统new
9、要求你写出一个高性能的web-server,说说你的解决方案
逻辑题:
1. 一块钱一瓶汽水,两个空瓶可以换一瓶汽水,20块钱最多能喝多少瓶汽水。20+20/2=30
2. 一个三角形的定点各有一只蚂蚁,问三只蚂蚁都不相撞的几率。2/(2*2*2)=1/4
3. 有一个3升的杯子和一个5升的杯子,如何量出4升的水。2+2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值