华为笔试题(5)

一、
验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。
例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
输入描述:
输入一个int整数
输出描述:
输出分解后的string
示例1
输入
6
输出
31+33+35+37+39+41

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //找规律发现就是n的平方往前往后隔2加n个数
        //偶数则初始是n^2+1和n^2-1;奇数则初始是n^2
        while(sc.hasNext()) {
            int n = sc.nextInt();
            StringBuffer sb = new StringBuffer();
            int square = n * n;

            if(n % 2 == 0) {
                int start = (square-1) - 2*(n/2 - 1);
                for(int i = 0; i < n - 1; i++) {
                    sb.append((start + 2 * i) + "+");
                }
                sb.append(start + 2*(n - 1));
            }else {
                int start = square - 2*(n / 2);
                for(int i = 0; i < n - 1; i++) {
                    sb.append((start + 2 * i) + "+");
                }
                sb.append(start + 2*(n - 1));
            }
            System.out.println(sb.toString());
        }
        sc.close();
    }
}

二、
计算两个字符串的最大公共字串的长度,字符不区分大小写
输入描述:
输入两个字符串
输出描述:
输出一个整数
示例1
输入
asdfas werasdfaswer
输出
6

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //最长公共子串问题,动态规划
        while(sc.hasNext()) {
            String str1 = sc.next().toLowerCase();
            String str2 = sc.next().toLowerCase();
            System.out.println(process(str1, str2));
        }
        sc.close();
    }

    private static int process(String str1, String str2) {
        int n = str1.length();
        int m = str2.length();
        int[][] dp = new int[n + 1][m + 1];
        int max = 0;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                if(str1.charAt(i - 1) == str2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }else {
                    dp[i][j] = 0;
                }
                max = Math.max(max, dp[i][j]);
            }
        }
        return max;
    }
}

三、
问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
?:匹配1个字符
输入描述:
先输入一个带有通配符的字符串,再输入一个需要匹配的字符串
输出描述:
返回匹配的结果,正确输出true,错误输出false
示例1
输入
te?t*.*
txt12.xls
输出
false

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //字符串匹配问题,动态规划
        while(sc.hasNext()){
            String reg = sc.next();
            String str = sc.next();
            System.out.println(process(reg, str));
        }
        sc.close();
    }

    private static boolean process(String reg, String str) {
        int n = reg.length();
        int m = str.length();
        boolean[][] dp = new boolean[n + 1][m + 1];
        dp[0][0] = true;
        for(int i = 1; i <= n; i++) {
            if(reg.charAt(0) == '*') {
                dp[i][0] = true;
            }
        }
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j<= m; j++) {
                if(reg.charAt(i - 1) == '*') {
                    dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
                }else {
                    dp[i][j] = dp[i - 1][j - 1] && 
                            (reg.charAt(i - 1) == '?' || reg.charAt(i- 1) == str.charAt(j - 1));
                }
            }
        }
        return dp[n][m];
    }
}

四、
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入
abcdefghijklmnop
abcsafjklmnopqrstuvw
输出
jklmnop

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //最长公共子串求大小用动态规划;直接求串则用截取法
        while(sc.hasNext()) {
            String str1 = sc.next().toLowerCase();
            String str2 = sc.next().toLowerCase();
            System.out.println(process(str1, str2));
        }
        sc.close();
    }

    private static String process(String str1, String str2) {
        if(str2.length() < str1.length()) {
            String tmp = str1;
            str1 = str2;
            str2 = tmp;
        }
        int n = str1.length();
        String res = null;
        int max = 0;//截止串最长长度
        for(int i = 0; i < n; i++) {//截止起始点
            for(int j = i + max; j < n; j++) {//截止终点
                String sub =str1.substring(i , j + 1);
                if(str2.contains(sub)) {
                    max = j + 1 - i;
                    res = sub;
                }else {
                    break;
                }
            }
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值