2020.4.8华为笔试二题(Java实现)

1. 编译器找ID总数

小华设计了一种编译语言最大支持N个字不同的字符,由这些字符组成的ID长度范围是“1

  • 思路:大数取模 + 组合数
import java.util.Scanner;
public class Test1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Long mod = 1000000007l;
        while (input.hasNext()) {
            Long n = input.nextLong();
            Long l = input.nextLong();
            if (n == 0 && l == 0) {
                break;
            }
            Long sum = 0l;
            Long k = n;
            while(l>0){
                sum+=k;
                sum%=mod;
                k=k*n%mod;
                l--;
            }
            System.out.println(sum);
        }
    }
}

结果ac

2.最大的二进制字符串

已知由0和1组成的字符串长度为n,可以进行以下两种操作:
(1)遇到任意“00”可以改变为“10”;
(2)遇到任意“10”可以改变为“01”
通过一波操作求此二进制数字最大为多少?

  • 思路:重点是判断两种条件,第一种直接换总是会更大,使用第二种操作的前提是“10”前面是“0”,才能保证换过之后ch[k]和ch[k+1]可以进行第一个操作,让字符串的值变大。
import java.util.Scanner;
public class Test2{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int t = input.nextInt();
        for(int i=0; i<t; i++) {
            int n = input.nextInt();
            String s = input.next();
            char[] ch = new char[10000];
            for (int j=0; j<n; j++) {
                ch[j] = s.charAt(j);
            }
            for (int k=0; k<n; k++) {
                if (ch[k] == '0' && ch[k + 1] == '0') ch[k] = '1';
                else if(ch[k]=='0' && ch[k+1] == '1' && ch[k+2] == '0'){
                    ch[k] = '1'; ch[k+1] = '0';ch[k+2] = '1';
                }
            }
            for (int k = 0; k < n; k++) {
                System.out.print(ch[k]);
            }
            System.out.println();
        }
    }
}

结果是case通过了70%;考完之后继续想,觉得应该是“10”变“01”情况的边界考虑不周。 只有在k+2 < n时,ch[k+2]才有必要去交换

你可能感兴趣的:(算法的代码实现)