2017校招笔试题

题目:输入一个字符串从左到右遍历,如果遇到三个连续相同的子串就将这个子串删除,并将原串剩下的部分拼接到一起,重复上述过程,直到字符串中没有可以删除的子串。
eg:
输入:AAABCCDDDCB
AABBBABBBA
输出:BB
A

重要:从一个字符串中删除一个子串,必须将原字符串的内容strcpy到开辟的数字中(new char[SIZE]),才能改变原字符串。相当于在数组中删除一部分。

#include<iostream>
using namespace std;
#pragma warning (disable:4996)

char* RmoveSubstr(char *str)
{
    if (str == NULL)
        return NULL;
    char *begin = str; //遍历字符串指针
    char *sub = str;   //指向有三个相同字符(子串)开始的地方
    char ch;
    int count = 0;
    while (1)
    {
        ch = *begin;
        count = 0;
        while (ch == *begin)
        {
            count++, begin++;
        }
        //开始删除
        if (count == 3)
        {
            sub = begin - 3; 
            while (*sub++ = *begin++) //逐个覆盖
            {}
            begin = str; //从头开始遍历
        }
        //退出条件,没有可删除的子串了
        else if (count < 3 && *begin == '\0')
            return str;
    }
}

int main()
{
    /*char *str = "AAABCCDDDCB";*/
    char *str = "AABBBABBBA";
    int len = strlen(str);
    /////////////////重要///////////////
    char *arr = new char[len + 1];
    strcpy(arr, str);
    //////////////////////////////////
    char *ret = RmoveSubstr(arr);
    cout << ret << endl;
    delete[] arr;
    return 0;
}

网易
这里写图片描述

/*思路:为了买尽量少的袋数,所以先要算出最多能买多少袋8个装的
        然后用剩余的个数/6,看是否能被6整除,如果不能则少拿一袋8个装的
        剩余的个数+8,再用剩余的个数/6,以此类推,知道8个装的个数减到0,
        还不能被6整除,则说明没有合适的购买方法,此时剩余的个数=总个数*/
int main()
{
    int N;
    cin >> N;
    int num8 = N / 8; //买8个装的个数
    int surplus = N % 8; //剩余的个数
    int num6 = 0; //买6个装的个数

    while (num8 >= 0 && surplus != 0)
    {
        num6 = surplus / 6;
        if (surplus % 6 == 0) //剩余的个数能被6整除,则刚刚好,可以退出程序
            break;
        else
        {
            num8--;
           //注意边界控制,当num8 = -1时,不能再+8
            if (num8 >= 0)
                surplus += 8;
        }
    }
    //剩余的个数 = 总个数,说明没找到合适的买法
    if (surplus == N)
        cout << -1 << endl;
    else
    {
        cout << "buy 8 : " << num8 << endl;
        cout << "buy 6 : " << num6 << endl;
        cout <<"total : "<< num8 + num6 << endl;
    }       
    return 0;
}

滴滴
题目:求一个数的阶乘末尾有几个0
eg:10! = 3628800 输出:2

#include<iostream>
#include<stack>
using namespace std;

//将数字装换成字符串 eg:1234->"1234"
void print(long long val)
{
    int count = 0;
    stack<long long> s;
    //向栈中依次插入1234,123,12,1
    while (val != 0)
    {
        s.push(val);
        val /= 10;
    }
    char ch[1024] = { '\0' };
    //将转换的字符存入字符数组中
    int len = s.size();
    for (int i = 0; i < len; i++)
    {
        long long top = s.top();
        s.pop();
        ch[i] = (top % 10) + '0';
    }       
    //从数组的末尾计算0的个数
    for (int i = len - 1; i >= 0; i--)
    {
        if (ch[i] == '0')
            count++;
        else
            break;
    }
    cout << count << endl;
}

int main()
{
    long long n, i, j = 1;
    cout << "请输入正整数n:" << endl;
    cin >> n;
    for (i = 1; i <= n; i++)
        j *= i;
    cout << "正整数" << n << "的阶乘为:" << j << endl;
    print(j);
    return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值