笔试强训之【Fibonacci数列和合法括号序列判断】

1.Fibonacci数列

1.1题目

链接: link

描述
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数。
输入描述:
输入为一个正整数N(1 ≤ N ≤ 1,000,000)
输出描述:
输出一个最小的步数变为Fibonacci数"
示例1
输入:
15
输出:
2

1.2解题思路

Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13,第一个数0,和第二个数1是固定的,往后的每一个数都等于前两个数相加。现在我们知道一个数n,想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,也就是说求n这个数离最近的Fibonacci数的值。

那么我们就可以让N处于两个Fibonacci数之间,后一个Fibonacci数大于n,前一个小于n,让我们再取最小值,即为我们的所求值,于是我们定义f1=0,f2=1,这两个值是固定的,然后我们将循环定位n>f2,让n小于f2的时候退出,此时n就正好处于中间位置,此时求得最小值就是结果。至于怎么样Fibonacci数变大就很容易了,让前两个数相加就是第三个数,以此类推,定义一个f3=f1+f2;让f1=f2;f2=f3;就可以了。
最后输出n-f1,f2-n的最小值

1.3代码

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        int f1=0;
        int f2=1;
        while(n>f2)
        {
            int f3=f1+f2;
            f1=f2;
            f2=f3;
        }      
       int min=Math.min(n-f1,f2-n);
        System.out.println(min);
    }
}

2.合法括号序列判断

2.1题目

链接: link
描述
给定一个字符串A和其长度n,请返回一个bool值代表它是否为一个合法的括号串(只能由括号组成)。

测试样例:
“(()())”,6
返回:true

测试样例:
“()a()()”,7
返回:false

测试样例:
“()(()()”,7
返回:false

2.2解题思路

1.首先字符串只能由括号组成,而括号是一对一对的,所以长度是偶数,所以如果n是奇数,那么一定是不符合的,直接返回false;
2.我们要想办法存储括号这个时候我们就会想到用栈来存储,栈=》先进后出,所以我们遍历字符串,如果遇到 “( ”。我们就将‘( ’入栈,反之遇到“)”,我们就出栈。
但是在出栈的时候要注意,栈是否为空,比如字符串第一个字符是“)”,那么这就是一个不合法的或者前面,前面的都匹配上了,但是接下来的是“)”,也是一个不合法的,此时栈里面为空,这个时候我们直接返回false就可以。当栈不为空的时候,我们还要判断栈顶是否是“( ”,如果是“(”,那我们就直接出栈
最后判断栈是否为空,如果为空就说明“(”和“)”的数量是匹配的,这个时候就是合法的,如果不为空就返回false。

2.3代码

import java.util.*;

public class Parenthesis {
    public boolean chkParenthesis(String str, int n) {
        if(n%2==1)
        {
            return false;
        }
        char[] ch=str.toCharArray();
        Stack<Character> stack=new Stack<>();
        for(int i=0;i<ch.length;i++)
        {
            if(ch[i]=='(')
            {
                stack.push(ch[i]);
            }
            if(ch[i]==')')
            {
                if(stack.isEmpty())
                {
                    return false;
                }
                if(stack.peek()=='(')
                {
                    stack.pop();
                }
            }
        }

        if(stack.isEmpty())
        {
            return true;
        }
        return false;
    }
}

3.选择题

  1. JAVA属于( D
    A 操作系统
    B 办公软件
    C 数据库系统
    D 计算机语言

  2. 类声明中,声明抽象类的关键字是 (B )
    A public
    B abstract
    C final
    D class

public是修饰权限的
abstract是抽象类
final 是常量,被定义的方法不可以被继承,定义的变量是常量不易被改变

3.在使用 interface 声明一个接口时,只可以使用(D)修饰符修饰该接口
A private
B protected
C private protected
D public

interface接口只能用public修饰

  1. Math.round(11.5) 等于(C
    A 11
    B 11.5
    C 12
    D 12.5

round函数是四舍五入

  1. 以下对继承的描述错误的是(A

A Java中的继承允许一个子类继承多个父类
B 父类更具有通用性,子类更具体
C Java中的继承存在着传递性
D 当实例化子类时会递归调用父类中的构造方法

JAVA允许一个子类继承一个父类

6.在 java 中 , 一个类(B
A 可以继承多个类
B 可以实现多个接口
C 在一个程序中只能有一个子类
D 只能实现一个接口

可以继承一个类
实现多个接口
可以有多个子类

7.关于以下程序代码的说明正确的(D
class HasStatic{
private static int x = 100;
public static void main(String args[ ]){
HasStatic hs1 = new HasStatic();
hs1.x++;
HasStatic hs2 = new HasStatic();
hs2.x++;
hs1=new HasStatic();
hs1.x++;
HasStatic.x–;
System.out.println( “x=” +x);
}
}
A 5行不能通过编译,因为引用了私有静态变量
B 10行不能通过编译,因为x是私有静态变量
C 程序通过编译,输出结果为:x=103
D 程序通过编译,输出结果为:x=102

x是静态的变量,不管是类调用还是对象调用都是x

8.以下 _____ 不是 Object 类的方法(====)
A clone()
B finalize()
C toString()
D hasNext()

9.下面哪一项不是 java 类访问权限控制关键字(B
A public
B this
C private
D protected

public private protected都是JAVA类修饰的权限

10.java 语言使用的字符码集是(D
A ASCII
B BCD
C DCB
D Unicode

ASCII是针对特殊字符的
BCD是针对数字的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值