腾讯笔试编程题(2017暑期实习生编程题)

1 编程题]构造回文
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。

输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。

输入例子:
abcdagoogle

输出例子:
22
腾讯笔试编程题(2017暑期实习生编程题)_第1张图片
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    while(sc.hasNext()){
        String s=sc.next();
        int len=s.length();
        int res=getRes(s);
        System.out.println(len-res);
         
    }
}
 
private static int getRes(String s) {
    if(s.length()==0){return 0;} //先求出s的逆序字符串 String ss=new StringBuffer(s).reverse().toString();
    //求俩个字符串的最长公共子串
    int[][] dp=new int[1001][1001];
    char[] a=s.toCharArray();
    char[] b=ss.toCharArray();
    for(int i=0;i
        dp[i][0]=0;
        dp[0][i]=0;
    }
    for(int i=1;i<=s.length();++i){
        for(int j=1;j<=ss.length();++j){
            if(a[i-1]==b[j-1])
                dp[i][j]=dp[i-1][j-1]+1;
            else
                dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
        }
    }
    return dp[s.length()][s.length()];
}
}
这个题很久都不能ac,原来刚来时的思路就是错的,后来看到网上的方法,换了一种思路才写出来。
   
2 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗?
腾讯笔试编程题(2017暑期实习生编程题)_第2张图片
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.next();
System.out.println(getRes(s));
}
}
static String getRes(String s){
if(s.length()==0){return s;}
String res="";
char[] chas=s.toCharArray();
for(int i=0;i
if(chas[i]>='a' && chas[i]<='z'){
res+=chas[i];
}
}
for(int i=0;i
if(chas[i]>='A' && chas[i]<='Z'){
res+=chas[i];
}
}
return res;
}
}
刚开始的时候用的是第二种方法,看到有人用了图片上的方法,感觉自己弱爆了。

3,[编程题]有趣的数字
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?


输入描述:
输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2...an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.


输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。

输入例子:
645 12 45 32 5 6

输出例子:
1 2
腾讯笔试编程题(2017暑期实习生编程题)_第3张图片
package com.chen.qq;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int[] a = new int[n];
for(int i=0;i
a[i] = sc.nextInt();
}
getRes(n,a);
}
}
static void getRes(int n,int[] array){
Arrays.sort(array);
//
if(array[0]==array[n-1]){
int tmp=(n*(n-1))/2;
System.out.println(tmp+" "+tmp);
}
Map map=new TreeMap();
for(int i=0;i
if(map.containsKey(array[i]))
map.put(array[i], map.get(array[i])+1);
else
map.put(array[i], 1);
}
//差最小个数
int min_count=0;
if(map.size()==n){
int min=Math.abs(array[1]-array[0]);
for(int i=2;i
int tmp=Math.abs(array[i]-array[i-1]);
if(tmp==min)
min_count++;
else if(tmp
min=tmp;
min_count=1;
}
}
}else{
for(Integer i:map.keySet()){
int val=map.get(i);
if(val>1){
min_count+=(val*(val-1))/2;
}
}
}
//差最大个数
int max_count=0;
List list=new ArrayList(map.keySet());
int val1=map.get(list.get(0));
int val2=map.get(list.get(list.size()-1));
max_count=val1*val2;
System.out.println(min_count+" "+max_count);
}
}
一开始我用的是HashMap来存放数据的,但是运行的时候ac不了,后来一想,hashmap里面的数是无序的,要想有序,还得treeMap来。

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