搜狐2017秋招研发工程师笔试题目

第一题:保留最大的数字

题目

给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。

输入描述:
输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 1000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。

输出描述:
输出保留下来的结果。

示例1
输入
325 1
输出
35

分析

例如数字51643,需要删除3位数而使剩下的数字组合最大,此时需要从头开始两个数字比较大小,
如果当前数字比其下一位小,则删除当前数字,此时变为5643,继续从头开始遍历,5比6小,则删除5,变为643 继续从头遍历,当走到4的位置发现4比3大,而且4已经是倒数第二位数字,则删除最后一位数字,就得到了64 。

关键点

  1. 每次j都需要从头遍历
  2. 2.需要考虑最后两个数字比较时,如果倒数第二位比最后一位小,需要删除最后一个数字。

代码

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    string number;
    int count;
    int j;
    cout<<"请输入一个十进制的正整数:";
    while(cin>>number)
    {
        cout<<"请输入要去掉的数字个数:";
        cin>>count;
        for(int i = 0;i<count;i++)
        {
            int length = number.length();
            for(j = 0;j<length-1;j++)
            {
                if(number[j]<number[j+1])
                {
                    number.erase(number.begin()+j);
                    break;
                }
            }
            if(j == length-1)  //例如51643,当j到数字倒数第二位时,4比3大,此时要删除3,
                number.erase(number.end()-1);
            j--; //每次都需要j--使j从数字的开始遍历。
        }
        cout<<number;
    }
    return 0;
}

第二题:彩色宝石项链

题目

有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。 有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链, 但是王后很喜欢红宝石,蓝宝石,紫水晶,翡翠和钻石这五种,我要你从项链中截取连续的一小段还给我, 这一段中必须包含所有的这五种宝石,剩下的部分你可以带走。如果无法找到则一个也无法带走。
请帮助学者找出如何切分项链才能够拿到最多的宝石。

输入描述:
我们用每种字符代表一种宝石,A表示红宝石,B表示蓝宝石,C代表紫水晶,D代表翡翠,E代表钻石,F代表玉石,G代表玻璃等等,
我们用一个全部为大写字母的字符序列表示项链的宝石序列,注意项链是首尾相接的。每行代表一种情况。
输出描述:
输出学者能够拿到的最多的宝石数量。每行一个
示例1
输入
ATTMBQECPD
输出
3

代码

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
    {
    string str;
    while (cin>>str) {
        int len=str.size();
        string str1="";
        for (int i=0;i<len-1;i++) {
            str1+=str[i];
        }
        str+=str1;
        int min=1000;
        int a,b,c,d,e,index=0;
        for (int i=4;i<2*len-1;i++) {
            a=0,b=0,c=0,d=0,e=0;
            for (int j=i;j>=0;j--) {
                if (str[j]=='A') a=1;
                if (str[j]=='B') b=1;
                if (str[j]=='C') c=1;
                if (str[j]=='D') d=1;
                if (str[j]=='E') e=1;
                index++;
                if (a+b+c+d+e==5) {
                    if (index<min) {
                        min=index;
                    }
                    index=0;
                    break;
                }
            }
        }
        if (min==1000) cout<<0<<endl;
        else cout<<len-min<<endl;
    }
    return 0;
}

第三题:袋鼠过河

题目

一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃。河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸。如果无法到达输出-1 。

输入描述:
输入分两行,第一行是数组长度N (1 ≤ N ≤ 10000),第二行是每一项的值,用空格分隔。
输出描述:
输出最少的跳数,无法到达输出-1
1
1
输入例子:
5
2 0 1 1 1
输出例子:
4

代码

#include <iostream>
#include <string>
using namespace std; 
int jump(int nums[], int n) {
    if (n == 0) return 0;
    int start = 0, end = 0, jumps = 0;
    while (jumps<=n&&end<=n - 1){
        ++jumps;
        int len = end;
        for (int i = start; i <= end; i++){
            if (nums[i] + i>len){
                len = nums[i] + i;
            }
        }
        start = end + 1;
        end = len;
    }
    if (jumps > n)
        jumps = -1;
    return jumps;
}
int main(){
    int n;
    cin >>n;
    int *array=new int[n];
    for (int i = 0; i < n; i++){
        cin >> array[i];
    }
    cout << jump(array, n);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值