侧边栏壁纸
博主头像
这就是之谦博主等级

我们的征途是星辰大海

  • 累计撰写 182 篇文章
  • 累计创建 3 个标签
  • 累计收到 16 条评论
标签搜索

目 录CONTENT

文章目录

途虎养车笔试21.9.13

这就是之谦
2021-10-04 / 0 评论 / 0 点赞 / 521 阅读 / 3,244 字
温馨提示:
本文最后更新于 2021-10-04,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

途虎养车笔试21.9.13

编程题1【验证回文字符串 Ⅱ】

力扣原题:680. 验证回文字符串 Ⅱ

1.给定一个非空字符串s,最多删除一个字符,判断是否能成为回文字符串。

示例1:

输入:aba

输出:true

示例2:

输入:abca

输出:true

解释:你可以先删除c字符

示例3:

输入:abcbd

输出:false

解释:从左向右读为abcbd,从右向左读为dbcba。因此不是一个回文数,即使删除一个也没办法做回文数

注意:字符串只包含从a-z的小写字母。字符串的最大长度是50000

做法1:

当时的做法是这样:

package com.lxw.demo;

import java.util.Scanner;

public class Demo06 {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        boolean result = validPalindrome(s);
        System.out.println(result);    

    }

    public static boolean validPalindrome(String s){
        if (f(s)){
            return true;
        }else{

            for (int i = 0; i < s.length(); i++) {
                String sNew = "";
                for (int j = 0; j < s.length(); j++) {
                    if (j!=i){
                        sNew +=s.charAt(j);
                    }
                }
                if (f(sNew)){
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean f(String s){
        int i = 0, j = s.length()-1;
        while(i<j){
            if (s.charAt(i)==s.charAt(j)){
                i++;
                j--;
            }
            else{
                return false;
            }
        }
        return true;
    }
}

虽然当时通过了所有的全部用例,但是始终觉得这样做的效率太低了。尤其是删除一个字符串那里。

参考网上大佬的方法,重新修改代码后:

package com.lxw.demo;

import java.util.Scanner;

public class Demo10 {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        boolean result = validPalindrome(s);
        System.out.println(result);


    }

    public static boolean validPalindrome(String s){
        int i = 0, j = s.length()-1;

        while(i < j){
            if(s.charAt(i) == s.charAt(j)){
                i++;
                j--;
            }else{
                String sub1 = s.substring(i, j); // [i,j-1] 剔除j
                String sub2 = s.substring(i+1, j+1); // [i+1,j] 剔除i
                return f(sub1) || f(sub2);
            }
        }
        return true;
    }

    public static boolean f(String s){
        int i = 0, j = s.length()-1;
        while(i<j){
            if (s.charAt(i)==s.charAt(j)){
                i++;
                j--;
            }
            else{
                return false;
            }
        }
        return true;
    }

}

编程题2【途虎动物园-斐波那契】

在途虎动物园里有一对老虎,从出生后第3个月起每个月都生一对老虎,老虎长到第3个月后每个月又生一对老虎,假如老虎都不死,写下方法函数来计算n个月后的老虎总数为多少?

示例1:

输入1

输出2

示例2:

输入2

输出2

示例3:

输入4

输出6

我的答案:

典型的斐波那契数列问题

2,2,4,6,10,16

package com.lxw.demo;

public class Demo07 {

    public static void main(String[] args) {
        System.out.println(countTiger(4));
    }

    //可以用数组也可以直接计算,本题只计算一次,所以效率一样
    public static int countTiger (int month) {

        int a1 = 2;
        int a2 = 2;
        int a3 = 2;
        int i = 0;
        while(i<month-2) {
            i++;
            a3 = a1+a2;
            a1=a2;
            a2=a3;
        }

        return a3;
    }
}

0

评论区