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;
}