华为笔试题(4)

2023-05-16

一、
计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)
沿着各自边缘线从左上角走到右下角,总共有多少种走法,
要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
输入描述:
输入两个正整数
输出描述:
返回结果
示例1
输入
2 2
输出
6

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        /* nXm格,则有(n+1)X(m+1)个点
         * 用递归,由于只能往下和往右,情况就比较少了
         */
        while(sc.hasNext()) {
            int n = sc.nextInt();
            int m = sc.nextInt();
            System.out.println(recur(n, m));
        }
        sc.close();
    }

    private static int recur(int posX, int posY) {
        //X等于0或Y等于0只能是朝一个方向走的,只有1种情况
        if(posX == 0 || posY == 0) {
            return 1;
        }
        return recur(posX - 1, posY) + recur(posX, posY - 1);
    }
}

二、
现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,
点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现)
如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。
现在需要你用程序来判断IP是否合法。
输入描述:
输入一个ip地址
输出描述:
返回判断的结果YES or NO
输入
10.138.15.1
输出
YES

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        /* nXm格,则有(n+1)X(m+1)个点
         * 用递归,由于只能往下和往右,情况就比较少了
         */
        while(sc.hasNext()) {
            String str = sc.next();
            String[] strs = str.split("\\.");
            System.out.println(process(strs));

        }
        sc.close();
    }

    private static String process(String[] strs) {
        //位数不合法
        if(strs == null || strs.length != 4) {
            return "NO";
        }
        //超界不合法
        for(int i = 0; i < strs.length; i++) {
            int tmp = Integer.parseInt(strs[i]);
            if(tmp > 255 || tmp < 0) {
                return "NO";
            }
        }
        return "YES";
    }
}

三、
功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
输入描述:
输入一个byte数字
输出描述:
输出转成二进制之后连续1的个数
输入
3
输出
2

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        /* byte型8位
         * 最大连续相同字符串问题
         */
        while(sc.hasNext()) {
            int n = sc.nextInt();
            System.out.println(process(n));

        }
        sc.close();
    }

    private static int process(int n) {
        //化成数组
        int tmp = n;
        int[] bit = new int[8];
        int index = 7;
        while(tmp != 0) {
            bit[index--] = tmp & 1;
            tmp >>>= 1;
        }
        int max = 0;
        int cnt = 0;
        //统计最大连续1串
        for(int i = 0; i < 8; i++) {
            if(bit[i] == 1) {
                cnt++;
                max = Math.max(max, cnt);
            }else {
                cnt = 0;
            }
        }
        return max;
    }
}

四、
找出一个随机字符串中最长回文串,输出它的长度
输入描述:
输入一个字符串
输出描述:
返回最长回文串的长度
输入
ABBA
输出
4

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //最长回文子串问题
        while(sc.hasNext()) {
            String str = sc.next();
            System.out.println(process(str));

        }
        sc.close();
    }

    private static int process(String str) {
        int n=str.length();
        int max=0;
        char[]ch=str.toCharArray();
        for(int i=0;i<n;i++){//以i为中心的回文串
            //奇数长度的子串
            int j=1;
            int cur=1;
            while(i-j>=0&&i+j<n&&ch[i-j]==ch[i+j]){//不越界且左右相等
                cur+=2;
                j++;
            }
            max=Math.max(cur,max);         
            //偶数长度的子串
            j=0;
            cur=0;
            while(i-j>=0&&i+j+1<n&&ch[i-j]==ch[i+1+j]){
                cur+=2;
                j++;
            }
            max=Math.max(cur,max);     
        }
        return max;
    }
}

五、
找出给定字符串中大写字符(即’A’-‘Z’)的个数
输入描述:
输入一个String数据
输出描述:
输出string中大写字母的个数
示例1
输入
add123#$%#%#O
输出
1

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()) {
            String str = sc.next();
            System.out.println(process(str));

        }
        sc.close();
    }

    private static int process(String str) {
        int n=str.length();
        int num = 0;
        for(int i = 0; i < n; i++) {
            char tmp = str.charAt(i);
            if(tmp >= 'A' && tmp <= 'Z') {
                num++;
            }
        }
        return num;
    }
}

六、
判断短字符串中的所有字符是否在长字符串中全部出现
输入描述:
输入两个字符串。第一个为短字符,第二个为长字符。
输出描述:
返回值
示例1
输入
bc
abc
输出
true

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //不是字符串匹配问题,只要求出现即可
        while(sc.hasNext()) {
            String strShort = sc.next();
            String strLong = sc.next();
            System.out.println(process(strShort, strLong));
        }
        sc.close();
    }

    private static boolean process(String strShort, String strLong) {
        int n = strShort.length();
        int m = strLong.length();
        int[] ch = new int[128];
        for(int i = 0; i < n; i++) {
            ch[strShort.charAt(i)] = 1;
        }
        for(int i = 0; i < m; i++) {
            ch[strLong.charAt(i)]++;
        }
        for(int i = 0; i < n; i++) {
            if(ch[strShort.charAt(i)] == 1) {
                return false;
            }
        }
        return true;
    }
}

七、
将两个整型数组按照升序合并,并且过滤掉重复数组元素
输入描述:
输入说明,按下列顺序输入:
1 输入第一个数组的个数
2 输入第一个数组的数值
3 输入第二个数组的个数
4 输入第二个数组的数值
输出描述:
输出合并之后的数组
示例1
输入
3
1 2 5
4
-1 0 3 2
输出
-101235

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()) {
            int n = sc.nextInt();

            TreeSet<Integer> set = new TreeSet<>();
            StringBuffer sb = new StringBuffer();
            for(int i = 0; i < n; i++) {
                set.add(sc.nextInt());
            }
            int m = sc.nextInt();
            for(int i = 0; i < m; i++) {
                set.add(sc.nextInt());
            }
            for(int i : set) {
                sb.append(i);
            }
            System.out.println(sb.toString());
        }
        sc.close();
    }
}

八、
对于不同的字符串,我们希望能有办法判断相似程度,
我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下:
1 修改一个字符,如把“a”替换为“b”。
2 增加一个字符,如把“abdd”变为“aebdd”。
3 删除一个字符,如把“travelling”变为“traveling”。
比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加和减少一个“g”的方式来达到目的。
上面的两种方案,都只需要一次操作。把这个操作所需要的次数定义为两个字符串的距离,
而相似度等于“距离+1”的倒数。
也就是说,“abcdefg”和“abcdef”的距离为1,相似度为1/2=0.5.
给定任意两个字符串,你是否能写出一个算法来计算出它们的相似度呢?
输入描述:
输入两个字符串
输出描述:
输出相似度,string类型
示例1
输入
abcdef
abcdefg
输出
1/2

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //编辑距离问题,用动态规划
        while(sc.hasNext()) {
            String a = sc.next();
            String b = sc.next();
            System.out.println(process(a, b));
        }
        sc.close();
    }

    private static String process(String a, String b) {
        int n = a.length();
        int m = b.length();
        int [][]dp = new int[n + 1][2];
        for(int i = 0; i <= n; i++){
            dp[i][0] = i;
        }
        for(int j = 1; j <= m; j++) {
            dp[0][1] = j;
            for(int i = 1; i <= n; i++) {
                if(a.charAt(i - 1) == b.charAt(j - 1)) {
                    dp[i][1] = dp[i - 1][0];
                }else {
                    dp[i][1]=Math.min(dp[i-1][1]+1, dp[i][0]+1);
                    dp[i][1]=Math.min(dp[i][1], dp[i-1][0]+1);
                }
            }
            for(int i = 0; i <= n; i++) {
                dp[i][0] = dp[i][1];
            }
        }
        return String.valueOf("1/"+(dp[n][1]+1));
    }
}

九、
请设计一个算法完成两个超长正整数的加法。
输入描述:
输入两个字符串数字
输出描述:
输出相加后的结果,string型
示例1
输入
99999999999999999999999999999999999999999999999999
1
输出
100000000000000000000000000000000000000000000000000

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //按位相加后处理进位问题即可
        while(sc.hasNext()) {
            String a = sc.next();
            String b = sc.next();
            System.out.println(process(a, b));
        }
        sc.close();
    }

    private static String process(String a, String b) {
        int[] bit = new int[Math.max(a.length(), b.length())];
        int i = a.length() - 1, j = b.length() - 1, k = 0;
        for(;i >= 0 && j >= 0; i--,j--,k++) {
            bit[k] = a.charAt(i) - '0' + b.charAt(j) - '0';
        }
        if(i >= 0) {
            while(i >= 0) {
                bit[k++] = a.charAt(i--) - '0';
            }
        }
        if(j >= 0) {
            while(j >= 0) {
                bit[k++] = b.charAt(j--) - '0';
            }
        }
        StringBuffer sb = new StringBuffer();
        for(i = 0; i < bit.length - 1; i++) {
            if(bit[i] > 9) {
                bit[i + 1]++;
                bit[i] -= 10;
            }
            sb.append(bit[i]);
        }
        if(bit[bit.length - 1] > 9) {
            sb.append(bit[bit.length - 1] - 10);
            sb.append(1);
        }else {
            sb.append(bit[bit.length - 1]);
        }
        return sb.reverse().toString();
    }
}

十、
给定一个正整数N代表火车数量,0

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //出栈全排序问题,可用递归
        //利用两个栈来模拟出栈入栈
        while(sc.hasNext()) {
            int n = sc.nextInt();
            int a[] = new int[n];
            for(int i = 0; i < n; i++) {
                a[i] = sc.nextInt();
            }
            Stack<Integer> stk1 = new Stack<>();
            Stack<Integer> stk2 = new Stack<>();
            for(int i = n - 1; i >= 0; i--) {
                stk1.push(a[i]);
            }
            List<String> res = new ArrayList<>();
            process("", stk1, stk2, res);
            Collections.sort(res);
            for(String s : res) {
                System.out.println(s);
            }
        }
        sc.close();
    }

    private static void process(String str, Stack<Integer>stk1, Stack<Integer>stk2, List<String> res) {
        if(stk1.isEmpty() && stk2.isEmpty()) {
            res.add(str.trim()) ;//过滤首位空白
            return;
        }
        if(!stk2.isEmpty()) {
            int tmp = stk2.pop();
            process(str+" "+tmp, stk1, stk2, res);
            stk2.push(tmp);
        }
        if(!stk1.isEmpty()) {
            int tmp = stk1.pop();
            stk2.push(tmp);
            process(str, stk1, stk2, res);
            stk2.pop();
            stk1.push(tmp);
        }
    } 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华为笔试题(4) 的相关文章

随机推荐