华为笔试题(9)

一、
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
给定函数count(int n),用于计算n以内(含n)完全数的个数。计算范围, 0 < n <= 500000
返回n以内完全数的个数。 异常情况返回-1
输入描述:
输入一个数字
输出描述:
输出完全数的个数
示例1
输入
1000
输出
3

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            int cnt = 0;
            for(int i = 1; i <= n; i++) {
                int sum = 0;
                for(int j = 1; j < i; j++) {
                    if(i % j == 0) {
                        sum += j;
                    }
                }
                if(sum == i) {
                    cnt++;
                }
            }
            System.out.println(cnt);
        }
        sc.close();
    }
}

二、
给出一个名字,该名字有26个字符串组成,
定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。
没有任何两个字母拥有相同的“漂亮度”。
字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。
输入描述:
整数N,后续N个名字
输出描述:
每个名称可能的最大漂亮程度
示例1
输入
2
zhangsan
lisi
输出
192
101

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //按照字母出现频率,从26往下排
        while(sc.hasNext()){
            int n = sc.nextInt();
            String[] names = new String[n];
            for(int i = 0; i < n; i++) {
                names[i] = sc.next();
                int sum = 0;
                int[] cnt = new int[26];
                int len = names[i].length();
                for(int j = 0; j < len; j++) {
                    cnt[names[i].charAt(j)-'a']++;
                }
                Arrays.sort(cnt);
                for(int j = 25; j >= 0; j--) {
                    if(cnt[j] == 0) {
                        break;
                    }
                    sum += cnt[j] * (j+1);
                }
                System.out.println(sum);
            }
        }
        sc.close();
    }
}

三、
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,
本题目要求输出组成指定偶数的两个素数差值最小的素数对
输入描述:
输入一个偶数
输出描述:
输出两个素数
示例1
输入
20
输出
7
13

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //从该偶数的中位数往左找素数,同时判断补数是否为正数
        while(sc.hasNext()){
            int n = sc.nextInt();
            int mid = n / 2;
            int left = mid;
            while(left >= 0) {
                if(isPrime(left) && isPrime(n - left)) {
                    System.out.println(left);
                    System.out.println(n - left);
                    break;
                }else {
                    left--;
                }
            }
        }
        sc.close();
    }

    private static boolean isPrime(int num) {
        for(int i = 2; i <= num / 2; i++) {
            if(num % i == 0) {
                return false;
            }
        }
        return true;
    }
}

四、
题目描述
找出字符串中第一个只出现一次的字符
输入描述:
输入一个非空字符串
输出描述:
输出第一个只出现一次的字符,如果不存在输出-1
示例1
输入
asdfasdfo
输出
o

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //LinkedHashMap可以按照输入顺序存储
        while(sc.hasNext()){
            String str = sc.next();
            int len = str.length();
            Map<Character, Integer> map = new LinkedHashMap<>();
            for(int i = 0; i < len; i++) {
                char ch = str.charAt(i);
                if(map.containsKey(ch)) {
                    map.put(ch, map.get(ch) + 1);
                }else {
                    map.put(ch, 1);
                }
            }
            boolean flag = true;
            for(char ch : map.keySet()) {
                if(map.get(ch) == 1) {
                    System.out.println(ch);
                    flag = false;
                    break;
                }
            }
            if(flag) {
                System.out.println(-1);
            }
        }
        sc.close();
    }
}

五、
输入n个整数,输出其中最小的k个。
输入描述:
输入说明
1 输入两个整数
2 输入一个整数数组
输出描述:
输出一个整数数组
示例1
输入
5 2
1 3 5 7 2
输出
1 2

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //排序
        while(sc.hasNext()){
            int n = sc.nextInt();
            int k = sc.nextInt();
            int[] a = new int[n];
            for(int i = 0; i < n; i++) {
                a[i] = sc.nextInt();
            }
            Arrays.sort(a);
            for(int i = 0; i < k - 1; i++) {
                System.out.print(a[i] + " ");
            }System.out.println(a[k - 1]);
        }
        sc.close();
    }
}

六、
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。
但是要保证汉字不被截半个,如”我ABC”4,应该截为”我AB”,输入”我ABC汉DEF”6,应该输出为”我ABC”而不是”我ABC+汉的半个”。
输入描述:
输入待截取的字符串及长度
输出描述:
截取后的字符串
示例1
输入
我ABC汉DEF
6
输出
我ABC

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //Unicode,汉字占3个字节,字母一个字节,通常字符在256内
        while(sc.hasNext()){
            String str = sc.next();
            int k = sc.nextInt();
            StringBuffer sb = new StringBuffer();
            int len = str.length();
            for(int i = 0; i < len && k > 0; i++) {
                if(str.charAt(i) > 256) {
                    k -= 3;
                    if(k >= 0) {
                        sb.append(str.charAt(i));
                    }
                }else {
                    sb.append(str.charAt(i));
                    k--;
                }
            }
            System.out.println(sb.toString());
        }
        sc.close();
    }
}

七、
Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。
许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。
要求:
给定任意两个字符串,写出一个算法计算它们的编辑距离。
输入描述:
输入两个字符串
输出描述:
得到计算结果
示例1
输入
abcdefg
abcdef
输出
1

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //编辑距离,典型的动态规划问题
        while(sc.hasNext()){
            String str1 = sc.next();
            String str2 = sc.next();
            int n1 = str1.length();
            int n2 = str2.length();
            int[][] dp = new int[n1 + 1][n2 + 1];
            //可以通过翻滚法节约空间
            for(int i = 0; i <= n1; i++) {
                dp[i][0] = i;
            }
            for(int i = 0; i <= n2; i++) {
                dp[0][i] = i;
            }
            for(int i = 1; i <= n1; i++) {
                for(int j = 1; j <= n2; j++) {
                    if(str1.charAt(i - 1) == str2.charAt(j - 1)) {
                        dp[i][j] = dp[i - 1][j - 1];
                    }else {
                        dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
                        dp[i][j] = Math.min(dp[i - 1][j - 1] + 1, dp[i][j]);
                    }
                }
            }
            System.out.println(dp[n1][n2]);
        }
        sc.close();
    }
}

七、
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
输入描述:
输入正整数N(N不大于100)
输出描述:
输出一个N行的蛇形矩阵。
示例1
输入
5
输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11

public class 从左下到右上半矩阵{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        /* 从左下输出到右上
         */
        while(sc.hasNext()){
            int n = sc.nextInt();
            int sum = n * (n + 1) / 2;
            int[][] a = new int[n][n];
            for(int i = 0; i < n; i++) {
                a[i] = new int[n - i];
            }
            int i = 0, j = 0;
            for(int k = 1; k <= sum;) {
                while(i >= 0 && j < n) {
                    a[i--][j++] = k++;
                }
                i = j;
                j = 0;
            }

            for(int h = 0; h < a.length; h++) {
                for(int k = 0; k < a[h].length - 1; k++) {
                    System.out.print(a[h][k]+" ");
                }System.out.println(a[h][a[h].length - 1]);
            }
        }
        sc.close();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值