2019华为秋招试题

1.两家商店打折,计算哪家价格最低,精确到分。

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

float process1(int num,float price)
{
    float sum_all = num*price;
    if (num >= 3)
        sum_all *= 0.7;
    if (sum_all < 50)
        sum_all += 10;
    return sum_all;
}
float process2(int num, float price)
{
    float sum_all = num*price;
    sum_all -= sum_all / 10 * 2;
    if (sum_all < 99)
        sum_all += 6;
    return sum_all;
}
int main()
{
    int num = 0;
    float price = 0;
    cin >> num >> price;
    int sum_1 = round(process1(num, price) * 100);
    int sum_2 = round(process2(num, price) * 100);
    if(sum_1==sum_2)
        cout<<0<<endl;
    else if(sum_1<sum_2)
        cout<<1<<endl;
    else
        cout<<2<<endl;
    return 0;
}

2.给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串,返回该子串的长度。
(():2
()():4
()(()):6
(()()):6
分析
1、记起始匹配位置start=-1;最大匹配长度ml=0;最大匹配长度是每个右括号出栈后都需要判断是否要更新的
2、考察第i位字符c
3、如果c为左括号,直接压栈。
4、如果c为右括号,分为两种情况:
一种是现有栈为空,表示没有匹配的左括号,start=i,为下一次可能的匹配做准备
另外一种情况是栈不空,这时候有括号一定和栈顶元素是匹配的,因为右括号是不允许进栈的,这时候需要出栈匹配。出站后又分为两种:
如果栈空,i-start即为当前找到的匹配长度,检查i-start是否比ml更大,是的ml得以更新。
如果栈不空,则当前栈顶元素t是上次匹配的最后位置,检查i-t是否比ml更大,使得ml得以更新。
5、注:因为入栈的一定是左括号,显然没有必要将他们本身入栈,应该入栈的是该字符在字符串中的索引。

#include<iostream>
#include<stack>
#include<string>
using namespace std;
int process(string s)
{
    stack<int> data;
    int max_num = 0;
    for (int i = 0; i< s.size(); ++i) 
    {
        if (s[i] == ')' && !data.empty() && s[data.top()] == '(') 
        {
            data.pop();
            if (data.empty())
                max_num = i + 1;
            else if (i - data.top() > max_num)
                    max_num = i - data.top();
        }
        else
            data.push(i);
    }
    return max_num;
}

int main()
{
    string str;
    cin >> str;
    cout<<process(str)<<endl;
    return 0;
}

3.给定一个字符串,求出其最长的重复子串。
暴力求解,枚举所有的子串,O(n^3)

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string data = "abcdbcdab";
    string temp;
    int max_len = 0;
    for (int i = 0; i < data.size(); ++i)
    {
        for (int j = 0; j<data.size()-i;++j)
        {
            temp = data.substr(i, j);
            int front = data.find(temp);
            int behind = data.rfind(temp);
            if (front != behind && temp.size() > max_len)
            {
                max_len = temp.size();
            }
        }
    }
    cout << max_len << endl;
    system("pause");
    return 0;

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值