目录
hello,这里是bangbang,今天是很简单的2道题。 日积跬步,以致千里!
1.计算斐波那契数最小差值
计算斐波那契数最小差值_牛客题霸_牛客网 (nowcoder.com)
解题思路:
1.模拟出斐波那契数列
使用3个数f,f1=0,f2=1(斐波那契数列前2个数字是0和1,后面的数是前两项求和)循环模拟实现出斐波那契数列,f是当前的斐波那契数。
2.寻找到离输入数字最近的2个斐波那契数(小于输入数字或者大于等于输入数字)
3.min(输入数字-较小的斐波那契数,较大的斐波那契数-输入数字),即求出最小差值
代码实现:
#include <iostream>
using namespace std;
int main() {
int f,f1=0,f2=1; //Fib
int n,left=0,right=0;//left是离n最近的较小Fib,right是离n最近的较大Fib
cin>>n;
while(1)
{
f=f1+f2;
f1=f2;
f2=f;
if(f<n)
{
left=f; //跟着循环更新至最近的较小Fib
}
else {
right=f;//最近的较大的Fib
break;
}
}
cout<<min(n-left,right-n)<<endl;
return 0;
}
2.合法括号序列判断
解题思路:看到这种匹配的题立马可以想到使用栈,栈的特性:后入先出,符合括号的匹配原则。
1.遍历字符串
2.出现'(’入栈,')'出栈(若栈此时不为空),为空说明没有匹配的')',此时之间返回false。
3.出现其他字符,直接返回false,因为题目只进行括号匹配
4.最后判断栈是否为空,为空说明全部匹配,返回true,上面出现3种操作,我们可以使用switch语句进行分支。
代码实现:
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
stack<char>st;
for(auto ch:A)
{
switch(ch)
{
case '(': //'('入栈
st.push(ch);
break;
case ')': //')'出栈
if(st.empty()) //为空说明没有匹配的'('
{
return false;
}
st.pop(); //不为空,正常出栈
break;
default: //其他字符,返回false
return false;
}
}
return st.empty(); //最终栈为空,说明全部匹配成功返回true
}
};