• 30天刷题计划(四)


    坚持!!!

    目录

    1.Fibonacci数列

    2.合法括号序列判断

    3.两种排序方法

    4.求最小公倍数


    1.Fibonacci数列

    Fibonacci数列_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=M666https://www.nowcoder.com/practice/18ecd0ecf5ef4fe9ba3f17f8d00d2d66?tpId=85&&tqId=29846&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

    ①题目及示例:

     ②方法解析:

    这个题的意思就是说给我们一个数,我们来找到它最小步数变为斐波那契数的这个最小值。而我们知道无非是大于其或者小于其的数中的一个。

    我们这里不采用递归的方法,而是采用相邻三个数间存在的关系,当n跳出循环后,就说明此时f2刚好是刚刚超过了n本身的斐波那契数,而此时f1正是f2的前一个斐波那契数,因此,我们就可以知道此时f1

    1. import java.util.*;
    2. public class Main {
    3. public static void main(String[]args){
    4. Scanner sc=new Scanner(System.in);
    5. int n=sc.nextInt();
    6. int f1=0;
    7. int f2=1;
    8. while(n>f2){
    9. int f3=f1+f2;
    10. f1=f2;
    11. f2=f3;
    12. }
    13. int min=Math.min(n-f1,f2-n);
    14. System.out.println(min);
    15. }
    16. }

    2.合法括号序列判断

    合法括号序列判断_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=M666https://www.nowcoder.com/practice/d8acfa0619814b2d98f12c071aef20d4?tpId=8&&tqId=11039&rp=1&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

    ①题目及示例:

     ②方法解析:

    判断括号是否合法。要考虑以下几点。第一,必须全是括号,不能出现字母等其他非括号。且如果合法,那么必然左右括号成对出现,则数目必然相等。我们采用两种方式来求。

    a.直接求解:

    1. import java.util.*;
    2. public class Parenthesis {
    3. public boolean chkParenthesis(String A, int n) {
    4. // write code here
    5. int count1=0;
    6. int count2=0;
    7. for(int i=0;i
    8. if(A.charAt(i)!='('&&A.charAt(i)!=')'){
    9. return false;
    10. }
    11. if(A.charAt(i)=='('){
    12. count1++;
    13. }
    14. if(A.charAt(i)==')'){
    15. count2++;
    16. }
    17. }
    18. if(count1==count2){
    19. return true;
    20. }
    21. return false;
    22. }
    23. }

    b.通过栈来求:将左括号入栈,当遇到右括号时,判断一下是否为空栈,不为空栈,则出一个,一直到栈为空为止。最后只需要判断下栈是否为空,为空表示已经出完了,return true;反之。

    1. import java.util.*;
    2. public class Main {
    3. public static boolean chkParenthesis(String A, int n) {
    4. // write code here
    5. if(n%2!=0){ return false; }
    6. Stackstack=new Stack<>();
    7. for(int i=0;i
    8. //当是'('时就入栈
    9. if(A.charAt(i)=='('){
    10. stack.push(A.charAt(i));
    11. //当是')'时就判断栈是否为空,若是栈为空,则表明数量不匹配,即匹配不了
    12. // 栈不为空的话,判断栈顶元素是否是'('
    13. }else if(A.charAt(i)==')'){
    14. if(stack.isEmpty()){
    15. return false;
    16. }else //if(stack.peek()=='('),不用判断这一句,因为本来入栈的都是左括号,只要栈不为空,那么栈顶元素必然为'('
    17. {
    18. stack.pop();
    19. }
    20. //则表示输入的既不是左括号,也不是右括号
    21. }else{
    22. return false;
    23. }
    24. }
    25. return stack.isEmpty();
    26. }
    27. public static void main(String[] args) {
    28. Scanner sc=new Scanner(System.in);
    29. String A=sc.nextLine();
    30. int n=sc.nextInt();
    31. System.out.println(chkParenthesis(A, n));
    32. }
    33. }

    3.两种排序方法

    两种排序方法_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=M666https://www.nowcoder.com/practice/839f681bf36c486fbcc5fcb977ffe432?tpId=85&&tqId=29844&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

    ①题目及示例:

     ②方法解析:

    本题主要考查字符串的比较,一是通过compareTo来进行字典形式的比较,二是通过字符串的长度来比较。需要注意的是将输入的字符串放入的是同一个字符串数组,然后根据下标值来对各个值进行比较。同时说明一下代码中的几个方法的含义。

    (1)BufferedReader是为了提供读的效率而设计的一个包装类,它可以包装字符流。可以从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。这里直接是在输入字节流的时候读取的。

    (2)readLine()方法,注意使用的时候要抛出异常

    (3)Integer.parseInt ()方法:把字符串s解析成有符号的int基本类型

     同时,Integer.valueOf(s):把字符串s解析成Integer对象类型

    这里是一个装箱过程。

    可以参考一下这位博主的博客:(3条消息) Integer.parseInt(s)与Integer.valueOf(s)的区别_HD243608836的博客-CSDN博客

    代码如下:

    1. import java.util.*;
    2. import java.io.*;
    3. public class Main {
    4. public static boolean lexicographically(String[] str){
    5. for(int i=0;i1;i++){
    6. if(str[i].compareTo(str[i+1])>0){
    7. return false;
    8. }
    9. }return true;
    10. }
    11. public static boolean lengths(String []str){
    12. for(int i=0;i1;i++){
    13. if(str[i].length()>str[i+1].length()){
    14. return false;
    15. }
    16. }return true;
    17. }
    18. public static void main(String[]args)throws IOException{
    19. BufferedReader re=new BufferedReader(new InputStreamReader(System.in));
    20. int n=Integer.parseInt(re.readLine());
    21. String[] str=new String[n];
    22. for(int i=0;i
    23. str[i]=re.readLine();
    24. }
    25. if(lengths(str)&&(lexicographically(str))){
    26. System.out.println("both");
    27. }else if(lengths(str)){
    28. System.out.println("lengths");
    29. }else if(lexicographically(str)){
    30. System.out.println("lexicographically");
    31. }else{
    32. System.out.println("none");
    33. }
    34. }
    35. }

    4.求最小公倍数

    求最小公倍数_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=M666https://www.nowcoder.com/practice/22948c2cad484e0291350abad86136c3?tpId=37&&tqId=21331&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking

    ①题目及示例:

     ②方法解析:

    我们首先需要知道,要求最小公倍数的话,可以用这两个数的乘积/这两个数的最大公约数。

    而两个数的最大公约数可以通过辗转相除法来实现。辗转相除法的核心是用除数除以余数,直到余数为0时的除数就是最大公约数。所以,代码如下:

    1. import java.util.*;
    2. public class Main {
    3. public static void main(String[] args) {
    4. Scanner sc=new Scanner(System.in);
    5. int a=sc.nextInt();
    6. int b=sc.nextInt();
    7. int times=a*b;
    8. int max=0;//最大公因数
    9. //要求最小公倍数,就用成绩除以最大公约数
    10. //最大公约数又可以用辗转相除法来求得
    11. if(a
    12. int tmp=a;
    13. a=b;
    14. b=tmp;
    15. }
    16. while(a%b!=0){//利用辗转相除法来求最大公因数
    17. int tmp=b;
    18. b=a%b;
    19. a=tmp;
    20. }
    21. System.out.println(times/b);
    22. }
    23. }

    除此之外,我们可以通过递归的方式求最大公因数,代码如下:

    1. import java.util.*;
    2. class Main {
    3. public static int digui(int x,int y){
    4. if(y==0){
    5. return x;
    6. }else {
    7. return digui(y,x%y);
    8. }
    9. }
    10. public static void main(String[] args) {
    11. Scanner sc=new Scanner(System.in);
    12. int a=sc.nextInt();
    13. int b=sc.nextInt();
    14. int max=digui(a,b);
    15. System.out.println(max);
    16. }
    17. }

    这里有点难饶,需要好好注意一下。

  • 相关阅读:
    Cesium快速上手9-Camera和Scene中的其他函数使用
    配置MatConvNet
    老司机必备的手机浏览器,比UC浏览器还好用
    全网最全Redis学习
    Ellipse
    使用python读取csv文件中的数据
    LVS和keepalived
    JAVA通过JNA 调用c++动态链接库
    K8s - 内部域名解析 - 外
    Docker Volume: 实现容器间数据共享与持久化的利器
  • 原文地址:https://blog.csdn.net/weixin_58850105/article/details/126013216