腾讯2017年暑期实习生编程题题解

    本篇博客主要为了就腾讯2017年暑期实习生编程题做一个题解,和大家进行简单分享,也为了自己对基础算法的巩固。

1.构造回文

腾讯2017年暑期实习生编程题题解_第1张图片
本题题目描述如上图,该题只需要进行稍微转化一下就是我们常见的算法题,首先最少需要删除字符,即求原序列的最大回文子序列(可不连续),那么最大回文子序列又可以转化为lcs问题,即原序列与逆序列的lcs问题。
代码实现:
import java.util.*;
public class MakingPalindromic {
	public static int lcs(String s1,String s2)
	{
		int[][] res=new int[s1.length()+1][s2.length()+1];
		int x=0;
		for(int i=1;i<=s1.length();i++)
		{
			for(int j=1;j<=s2.length();j++)
			{
				if(s1.charAt(i-1)==s2.charAt(j-1))
					x=1;
				else
					x=0;
				res[i][j]=Math.max(res[i-1][j-1]+x, Math.max(res[i-1][j], res[i][j-1]));
			}
				
		}
		return res[s1.length()][s2.length()];
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		while(sc.hasNextLine())
		{
			String s1=sc.nextLine();
			StringBuffer sb=new StringBuffer(s1);
			sb.reverse();
			String s2=""+sb;
			int ans=s1.length()-lcs(s1,s2);
			System.out.println(ans);
		}

	}

}


2.算法基础--字符移位

腾讯2017年暑期实习生编程题题解_第2张图片
本题的一个主要难点便是不能申请额外的空间。因为要求大写字母放到后面,小写字母放前面,且各个字符相对位置不变,那么我们可以想到的便是具有稳定性的且进行原地排序的排序算法,这里我选择的是插入排序。但是对于字符串来说如何在不申请额外空间的情况下实现插入排序呢,因为string是不可变更的,因此这里我使用的是stringbuffer类,而stringbuffer类的setCharAt(int index,char ch)方法可以实现移位。所以,代码如下:
代码实现:
import java.util.*;
public class CharMove {
	
	public static StringBuffer insertSort(StringBuffer s)
	{
		int n=s.length();
		for(int i=1;i='a'&&s.charAt(j)<='z')
			{
				while(j>=1&&(s.charAt(j-1)>='A'&&s.charAt(j-1)<='Z'))
				{
					s.setCharAt(j, s.charAt(j-1));
					j--;
				}
			}
			s.setCharAt(j, v);
		}
		return s;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		while(sc.hasNextLine())
		{
			StringBuffer sb=new StringBuffer(sc.nextLine());
			System.out.println(insertSort(sb));
		}
	}

}

另外,还有一种更简答的思路,即字符串匹配的方法,因为前面全部为小写,后面全部为大写,所以只需匹配小写的加上匹配大写的合并即可,这里匹配采用relaceAll,首先将大写的全部用""替换,然后将小写的用空字符串替换,再将两者加上即可。
代码实现:
import java.util.*;
public class CharMove {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		while(sc.hasNextLine())
		{
			String s=sc.nextLine();
			System.out.println(s.replaceAll("[A-Z]", "")+""+s.replaceAll("[a-z]", ""));
		}
	}

}


3.有趣的数字

腾讯2017年暑期实习生编程题题解_第3张图片

本题需要将问题都各种情况先列清楚
 * 1.所有数字都一样,那么只需要输出n*(n-1)/2即可
 * 2.最大差就是最小值的个数乘以最大值的个数,所以这里用了hashmap用于统计各个参数的个数
 * 最小差又需要分为两种情况:1,元素都互异,则只需将序列排序,然后求出相邻差值,找出最小值,并查看个数即可,2.元素有相同的,遍历hashmap,并用q统计个数
 * 若有元素个数l大于1,则q+=(l-1)*l/2.
 * 最终输出最小差最大差即可

代码实现:
import java.util.*;
public class InterestingNum {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext())
		{
			int n=Integer.parseInt(sc.nextLine());
			int[] res=new int[n];
			String[] s1=sc.nextLine().split(" ");
			for(int i=0;i1)
					{
						flag=true;
						q+=(tmp-1)*tmp/2;
					}
						
				}
				ArrayList list=new ArrayList();
				for(int j=1;j

如果大家发现我分析有误的,随时可以跟我提出,万分感谢。

你可能感兴趣的:(算法题题解)