笔试5:Interlyst

编程1

斜对齐打印m*n数组。
输入描述
1 2 3 4
5 6 7 8
9 10 11 12
输出描述
1,2,5,3,6,9,4,7,10,8,11,12
注意输出格式。

编程2

母羊的寿命为5年,其在第2年和第4年底各生下一头母羊,第5年死去。一开始有1头母羊,则15年后有多少只母羊?
输入描述
母羊在第2年、第4年各生下一头母羊,第5年死去。
输出描述
15年后有多少只母羊?
这个题目,本来想只输出一个结果,然并卵……这种题目对目前的我来说是天堑,动态规划吗?唉……

编程3

实现简单计算器功能,输入一个字符串,输出结果。
注意:字符串只包含加、减、乘、除符号和空格。
输入描述1
3+2*2
输出描述1
7
输入描述2
3 + 2*2
输出描述
7
这个题目,我记着做过力扣“150逆波兰表达式求值”还有印象,于是乎:

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

int computeString(string &str)
{
    int ans = 0;
    stack<int>number;
    stack<char>ch;
    auto len = str.length();
    for (int i = 0;i < len;++i)
    {
        if (str[i] >= '0'&&str[i] <= '9')//是数字,我这里其实忘记加=
            number.push(str[i] - '0');
        else if (str[i] != ' ')
            ch.push(str[i]);
    }
    while (!ch.empty())
    {
        auto c = ch.top();ch.pop();
        auto n1 = number.top();number.pop();
        auto n2 = number.top();number.pop();
        if (c == '+')
            number.push(n2 + n1);
        else if (c == '-')
            number.push(n2 - n1);
        else if (c == '*')
            number.push(n2*n1);
        else if (c == '/')
            number.push(n2 / n1);
    }
    return number.top();
}
int main()
{
    string str;
    cin>>str;
    cout<<computeString(str)<<endl;
return 0;
}

过了0.6,下来想了想为什么测试用例2过不了,WTF,空格截断!!!所以我应该用getline(cin,str)读入一行内容,emmmm……

编程4

假设有n颗糖,将它们摆成m行,每行糖的个数相当于当前行数。
输入描述
给定糖的个数n,如10
输出描述
可摆列的行数,如4
一看例子,这不是就是等差数列来着,算了算公式,然后如下:

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int ans = ((int)sqrt(8*n+1)-1)/2;    //这里其实求了下界
    cout<<ans;
    return 0;
}

然后可能我没有包含头文件也记不起来是哪个,不支持sqrt,好吧,于是乎:

#include<iostream>
using namespace std;
int helper(int n)
{
    for(int i=0;i<n;++i)
        if(i*i<n&&(i+1)*(i+1)>n)
            return i;
}

int main()
{
    int n;
    cin>>n;
    int ans = (helper(8*n+1)-1)/2;
    cout<<ans;
    return 0;
}

超时了,于是乎:

int main()
{
    int n;
    cin >> n;
    int ans = 0;
    int i = 1;
    while (n > 0)
    {
        ans++;
        n -= i;
        i++;
    }
    cout << ans;
    return 0;
}

通过0.2,WTF,于是乎:

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int ans = 0;
    for(int i=1;i<n-i;++i)
        ans++;
    if(ans*(ans+1)/2>n)
        ans--;
    cout<<ans;
    return 0;
}

过了0.6。下来思考了一下,感觉最后的代码怪怪的。而0.2的代码把多出来的糖数目不够行数目的那一行算进去了,NMD。

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务