美团点评2018春招两道编程题

本文介绍了美团2018年春季招聘面试中的两道编程题目,第一题涉及字符串距离计算,要求求解字符串S中与字符串T长度相同的子串与T的距离之和;第二题关注有限字符组成数字的问题,需要找出在有限的数字字符中无法表示的最小正整数。题目提供了样例输入和输出,适合考察面试者的算法和逻辑思维能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题:字符串距离

题目:
给出两个相同长度的由字符 a 和 b 构成的字符串,定义它们的距离为对应位置不同的字符的数量。如串”aab”与串”aba”的距离为 2;串”ba”与串”aa”的距离为 1;串”baa”和串”baa”的距离为 0。下面给出两个字符串 S 与 T,其中 S 的长度不小于 T 的长度。我们用|S|代表 S 的长度,|T|代表 T 的长度,那么在 S 中一共有|S|-|T|+1 个与T长度相同的子串,现在你需要计算 T 串与这些|S|-|T|+1 个子串的距离的和。

输入描述:
第一行包含一个字符串 S。第二行包含一个字符串 T。S 和 T 均由字符 a 和 b 组成,1 ≤ |T| ≤ |S| ≤105 。

输出描述:
输出对应的答案。

样例1:
aab
aba

2

样例2:
aaabb
bab

5

import java.util.*;
public class getStringDis{
	

	public static void main(String[]args)
	{
       //System.out.println("Hello");
		Scanner sin=new Scanner(System.in);
		String s;   //母串
		String t;   //子串
		while(sin.hasNext())
		{   	
			s=sin.nextLine();
			t=sin.nextLine();
			if(t.length()<s.length()
			  &&s.length()>0&&s.length()<105
			  &&t.length()>0&&t.length()<105)
			{
               char[]chs=s.toCharArray();
               char[]cht=t.toCharArray();
               int sum=0; //输出两个字符串的距离
               for(int i=0;i<=chs.length-cht.length;i++)
               {
               	   for(int j=0;j<cht.length;j++)
               	   {
               	   	   int k=i;
                       if(cht[j]!=chs[k++])
                       {
                       	 sum+=1;
                       }
               	   }
               }
               System.out.println(sum);
			}
		}
    }
}
 //方法二:优化后的代码(时间复杂O(s.length))
	public static int getStringDis(String s,String t)
	{
            int m=0;  //统计模式串相邻的字符总长度
            int n=0;
            int sum=0; //记录放回的字符串长度
            int s_len=s.length();
            int t_len=t.length();
            char[]chs=s.toCharArray();
            char[]cht=t.toCharArray();
            
            //对模式串统计
            for(int i=0;i<t_len-1;i++)
            {
            	 if(cht[i]!=cht[i+1])
            	 {
            	 	  ++m;
            	 }
            }
            //对子、母串前t_len长度统计
            for(int j=0;j<t_len;j++)
            {
            	  if(chs[j]!=cht[j])
            	  {
            	  	  ++n;
            	  }
            }
            sum+=n;  //统计第一次匹配总共距离
            for(int k=t_len;k<s_len;k++)
            {
                if(chs[k-t_len]!=cht[0])
                {
                	n-=1;
                }
                if(chs[k]!=cht[t_len-1])
                {
                	n=n+m+1;
                }else{
                	n=n+m;
                }
                n=n%(t_len+1); //防止统计越界
                sum+=n;

            }
           return sum;

	}


第二题:数字字符
题目:
在十进制表示中,任意一个正整数都可以用字符‘0’-‘9’表示出来。但是当‘0’-‘9’这些字符每种字符的数量有限时,可能有些正整数就无法表示出来了。比如你有两个‘1’,一个‘2’ ,那么你能表示出 11,12,121 等等,但是无法表示出 10,122,200 等数。
 
现在你手上拥有一些字符,它们都是‘0’-‘9’的字符。你可以选出其中一些字符然后将它们组合成一个数字,那么你所无法组成的最小的正整数是多少?

输入描述:
第一行包含一个由字符’0’-‘9’组成的字符串,表示你可以使用的字符。1 ≤ 字符串长度 ≤ 1000

输出描述:
输出你所无法组成的最小正整数。

样例1:
55

1

样例2:
123456789

10

import java.util.*;
public class getMinInt{
	
	public static void main(String[]args)
	{
      
		Scanner sin=new Scanner(System.in);
		String s;   //输入字符串
		while(sin.hasNext())
		{   	
			s=sin.nextLine();
      int[]arr=new int[10];  //统计每个数字出现的频率
      int min=Integer.MAX_VALUE;
      int digit=-1;
			if(s.length()>0&&s.length()<1001)
			{
            char[]chs=s.toCharArray();
            for(int i=0;i<chs.length;i++)
            {

                 ++arr[chs[i]-'0'];
			      }
                 
            for(int i=1;i<arr.length;i++)
            {
               //寻找最小值
                if(min>arr[i])
                {
                   min=arr[i];
                   digit=i;
                }
                  
            }
          //然后检查是否能够凑出n位数(1......n)
          //System.out.println(min);
            if(arr[0]+1<=min)
            {   String str="1";
                for(int i=0;i<min;i++)
                {
                    str+="0";
                }
                System.out.println(str);
            }else{

                String str=digit+"";
                for(int i=0;i<min;i++)
                {
                    str+=digit+"";
                }
                System.out.println(str);
            }
          }
      }
	}
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值