美团2018在线编程

参考了大佬的c/c++,欢迎指正

https://blog.csdn.net/flushhip/article/details/79660602

import java.util.Scanner;

/**
 * 2018美团校招后台开发在线测试第二题
 * 求不能组成的最小正整数
 * @author LP
 *
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            char[] arr = sc.nextLine().toCharArray();
            System.out.println(method(arr));
        }
        sc.close();
    }
    public static String method(char[] arr){
        int[] num = new int[10];//num[i]是数字i出现的次数
        int min = Integer.MAX_VALUE;//最小出现次数(不算0)
        int minN = 0;//最小出现次数对应的数字
        StringBuffer sb = new StringBuffer();
        for(char c : arr){
            num[c - 48]++;//记录出现次数
        }
        //System.out.println(Arrays.toString(num));
        for(int i = 1; i < 10; i++){
            if(min > num[i]){
                min = num[i];//记录最小出现次数
                minN = i;//记录出现次数最少的那个数字
            }
        }
        if(num[0] + 1 <= min){//0出现的次数比最少的还少1次,或者更少。比如0是1次,其他是2次。那就返回100
            sb.append(minN);//出现次数最小的那个数
            for(int i = 1; i <= num[0] + 1; i++)
                sb.append(0);//后边添加num[0]+1个0
        }else{//0出现的次数不是最少的,要么一样多,要么比别的还多,比如都是2次,返回111
            for(int i = 1; i <= min + 1; i++)
                sb.append(minN);//最少次数的那个数添加它的次数+1次
        }
        //System.out.println("数字" + minN + "---出现了" + min + "次");
        return sb.toString();
    }
}
import java.util.Scanner;

/**
 * 2018美团校招后台开发在线测试第一题
 * 求两个字符串的差距(和s每一个长度相同的子串比较对应位置不同的数目和)
 * 串s,t,s比t长,s和t都由a或b组成
 * s:babb t:ab
 * ba和ab比,两个位置不同
 * ab和ab比,相同
 * bb和ab比,一个位置不同
 * 返回3
 * 
 * 暴力会超时
 * @author LP
 *
 */
public class MeiTuan_01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String t = sc.nextLine();
        System.out.println(method(s, t));
    }
    public static int method(String s, String t){
        int a = 0;
        int b = 0;
        int res = 0;
        for(int i = 0; i <= s.length() - t.length(); i++){
            if(s.charAt(i) == 'a')
                a++;
            else
                b++;
        }
        for(int i = 0; i < t.length(); i++){
            if(t.charAt(i) == 'a')
                res += b;
            else
                res += a;
            if(s.charAt(i) == 'a')
                a--;
            else
                b--;
            if(i + t.length() < s.length()){
                if(s.charAt(i + t.length()) == 'a')
                    a++;
                else
                    b++;
            }
        }
        return res;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值