京东算法岗综合题

匿名网友 匿名网友 发布于: 2016-07-08 00:00:00
阅读 220 收藏 0 点赞 0 评论 0

问题描述:输入数据仅包含一组测试样例,对于每组测试案例,共有两行输入数据,输入第一行代表要处理的字符串s1(不超过50),输入第二行代表替换的字符串s2(不超过10).

样例输入:

You are the best
123
To be NO.1
Yes
Thank you very much
%%%

样例输出:

You1234are1234the1234best
ToYesbeYesNO.1
Thank%%%you%%%very%%%much

解题思路:可以参阅《剑指offer》P46页替换空格那道题。

#include <iostream>
using namespace std;

char* replace_blank(char str[], char strB[], int len, int lenB)
{
    if(str == NULL || len <= 0) {
        return NULL;
    }

    int i = 0, numberBlanks = 0; // cnt为整个字符串的空格个数,size为字符串字符个数
    while(str[i] != '\0') {
        if(str[i] == ' ') {
            ++numberBlanks;
        }
        ++i;
    }

    for(i = len-1; i >= 0; --i) {
        if(str[i] != ' ') {
            str[i+numberBlanks*(lenB - 1)] = str[i];
            // 测试输出
            //char tt = str[i];
            //int tmp = i+numberBlanks*(lenB - 1);
            //cout << tmp << ": " << tt << endl;
        }
        else {
            for(int j = 0; j < lenB; j++){
                str[i+numberBlanks*(lenB - 1) - j] = strB[lenB -1 - j];
                // 测试输出
                //char tt = strB[lenB -1 - j];
                //int tmp = i+numberBlanks*(lenB - 1) - j;
                //cout << tmp << ": " << tt << endl;
            }
            --numberBlanks;
        }
    }
    return str;
}

int main(int argc, const char * argv[]) {

    string inputA, inputB;
    getline(cin, inputA);
    getline(cin, inputB);
    int lenA = (int)inputA.length();
    int lenB = (int)inputB.length();
    char strA[lenA];
    char insertedB[lenB];
    strcpy(strA, inputA.c_str());
    strcpy(insertedB, inputB.c_str());
    char* afterInserted = replace_blank(strA, insertedB, lenA, lenB);
    cout << afterInserted << endl;

    return 0;
}

问题描述:小东和三个小朋友在一起玩小球,他们是一种新玩法。他们站在楼房的不同层,假设小东站在的楼层距离地面N米,球从小东的手里自由落下,每次落地后跳回返回原地面的一半;再落回地下,再反跳回原高度的一半。小东和三个小朋友站在不同的楼层,同时放下手中不同的小球,当小球全部落下地面不跳事,求4个小球一共经过了多少米?(数字都为整数)。

输入:

输入4个数字,分别表示四个小球距离地面的高度,所有输入的数字都为整数,范围不能超过整数所能表示的最大值。

输出:

输出为4个小球经过的总长度

样例输入:

100 90 80 70

样例输出:

996

解题思路:这道题只要不是等比数列取极限定势思维先入为主,并且注意到了数字都为整数这条信息,就非常非常容易做了,当时做的时候真坑,没注意到数字都为整数,然后陷入等比数列取极限的坑。下面是自己写的参考代码:

int ballDistance(int h){
    int sumH = h;
    int halfH = (int)h/2.0;
    while(halfH != 0){
        sumH = sumH + 2*halfH;
        halfH = (int)halfH/2.0;
    }
    return sumH;
}

int main(int argc, const char * argv[]) {


    int t1, t2, t3, t4;
    cin >> t1 >> t2 >> t3 >> t4;
    int sum = ballDistance(t1) + ballDistance(t2)  + ballDistance(t3) + ballDistance(t4);
    cout << sum << endl;
    return 0;
    }

评论列表
文章目录