目录
Fibonacci数列__牛客网
Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。
思路:首先得知道如何求fibonacci数列,两种方式一种递归,一种循环。
其次就是,什么时候找最小步数,比如给你个数字7,从0,1,1,2,3,5,8,好了当到8的时候你就知道我可以计算最小步数了,也就是首次遇到大于7的数字,那不就是当7<=某一个fib数时停止。最后就是如何判断最小步数了,那还不简单。拿7来说,和后面的8相减,和前面的5相减,谁小那最小步数不就是谁吗
循环代码:
int f1 = 0;
int f2 = 1;
int fn = 0;
while(true){
//写法是有先后顺序的
fn = f1 + f2;
//从第三项开始输出的0,1,1,2,3...
System.out.println(fn);
f1 = f2;
f2 = fn;
}
代码实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();//num>=1
int f1 = 0;
int f2 = 1;
int fn = 0;
while(true){
fn = f1 + f2;
//首次小于或等于fn
if(num == fn){
System.out.println(0);
return ;
//小于就前后判断,看谁差值更小
}else if(num < fn){
int min = fn - num;
if(min > (num - f2)){
min = num - f2;
}
System.out.println(min);
return;
}
//这是有顺序的
f1 = f2;
f2 = fn;
}
}
}
方式二:将循环和判断分离
注意点:每次循环,都会使f1,f2更新,并且fn == f2的
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();//num>=1
int f1 = 0;
int f2 = 1;
int fn = 0;
while(num > fn){
fn = f1 + f2;
f1 = f2;
f2 = fn;
//执行一次,f1,f2都更新了,且此时f2=fn
}
//此时 f2<num<=fn,但是while循环更新了f1和f2,也就是f1此时是f2,f2此时是fn
int min = Math.min(f2 - num, num - f1);
System.out.println(min);
}
}
合法括号序列判断__牛客网
给定一个字符串A和其长度n,请返回一个bool值代表它是否为一个合法的括号串(只能由括号组成)。
测试样例:
"(()())",6
返回:true
思路:利用栈结构遍历字符串,将‘ ( ’进行压入,当遇到‘ ) ’时先判断栈中是否为空,非空就进行出栈,否则不匹配。在遍历的时候要注意,只能出现‘( ’ 或 ‘ )’,否则也不匹配。
核心代码:遇到‘(’就入栈,遇到‘)’先判断栈空,不空则弹栈。
//如果是‘(’就入栈
if(A.charAt(i) == '(')
stack.push('(');
else{//否则就是‘)’,那就栈出一个
//记着先判断栈是否为空
if(stack.empty())
return false;
else
stack.pop();
}
代码实现:
import java.util.Stack;
public class Parenthesis {
public boolean chkParenthesis(String A, int n) {
//栈结构实现
Stack<Character> stack = new Stack<>();
for(int i = 0; i < A.length(); ++i){
//1.如果不是‘(’和‘)’直接false
if(A.charAt(i) != '(' && A.charAt(i) != ')')
return false;
//如果是‘(’就入栈
if(A.charAt(i) == '(')
stack.push('(');
else{//否则就是‘)’,那就栈出一个
//记着先判断栈是否为空
if(stack.empty())
return false;
else
stack.pop();
}
}
//stcak中无元素,那就说明的确匹配了 避免:((())
if(!stack.isEmpty()){
return false;
}
return true;
}
}