校招編程題

騰訊暑期實習編程題
1、構造迴文
給定一個字符串s,你可以從中刪除一些字符,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢?
輸出需要刪除的字符個數。

輸入描述:

輸入數據有多組,每組包含一個字符串s,且保證:1<=s.length<=1000.

輸出描述:

對於每組數據,輸出一個整數,代表最少需要刪除的字符個數。

輸入例子1:
abcda
google

輸出例子1:
2
2

思路:因爲迴文是從前往後讀和從後往前讀的結果一樣,所以這個題可以轉換成最長公共子序列問題(LCS問題),即求出字符串和字符串的反串之間的最長公共子序列。
最長公共子序列問題(LCS問題):
https://www.cnblogs.com/wangkundentisy/p/9346376.html

代碼:



import java.nio.charset.spi.CharsetProvider;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	static int max=0;
	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);
		while(input.hasNext()){
			String string = input.nextLine();
			char[] array = string.toCharArray();
			char[] temparray = new char[array.length];
			int[][] result = new int[array.length+1][array.length+1];
			for(int i=0;i<array.length;i++)
				temparray[i] = array[array.length-1-i];

			for(int i=0;i<array.length;i++){
				result[0][i]=0;
				result[i][0]=0;
			}
			
			for(int i=1;i<=array.length;i++){
				for(int j=1;j<=array.length;j++){
					if(array[i-1]==temparray[j-1]){
						result[i][j]=result[i-1][j-1]+1;
					}else{
						result[i][j]=Math.max(result[i-1][j], result[i][j-1]);
					}
				}
			}
			
			System.out.println(array.length-result[array.length][array.length]);
			
			
		}
	}
	
	
}

二、大寫字母挪到小寫字母后
小Q最近遇到了一個難題:把一個字符串的大寫字母放到字符串的後面,各個字符的相對位置不變,且不能申請額外的空間。
第一種思路:用冒泡的方法,從後向前遍歷字符串,把大寫字母用冒泡的方法放在字符串後面。
第二種思路:將字符串去掉大寫字母+字符串去掉小寫字母,即 str.replaceAll("[A-Z]","")+str.replaceAll("[a-z]","");

待補
import java.util.*;
public classMain{
    public static void main(String[] args){
        Scanner scan = newScanner(System.in);
        while(scan.hasNext()){
            String str = scan.nextLine();
            System.out.println(getResult(str));
        }
    }
    public static String getResult(String str){
         
         
        return str.replaceAll("[A-Z]","")+str.replaceAll("[a-z]","");
    }
      
}

華爲研發工程師編程題
一、汽水瓶
有這樣一道智力題:“某商店規定:三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?”答案是5瓶,方法如下:先用9個空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這瓶滿的,這時候剩2個空瓶子。然後你讓老闆先借給你一瓶汽水,喝掉這瓶滿的,喝完以後用3個空瓶子換一瓶滿的還給老闆。如果小張手上有n個空汽水瓶,最多可以換多少瓶汽水喝?

輸入描述:
輸入文件最多包含10組測試數據,每個數據佔一行,僅包含一個正整數n(1<=n<=100),表示小張手上的空汽水瓶數。n=0表示輸入結束,你的程序不應當處理這一行。

輸出描述:
對於每組測試數據,輸出一行,表示最多可以喝的汽水瓶數。如果一瓶也喝不到,輸出0。

思路:每次喝完水之後都要進行新一輪的換瓶子,很像是遞歸,所以用遞歸來做。每次輸入空瓶數,計算出能換幾瓶水。


import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);
		while(input.hasNext()) {
			int n = input.nextInt();
			if(n==0)
				break;
			else {
				System.out.println(Ping(n));
			}
		}
	}
	
	public static int Ping(int numPing){
		if(numPing==2)
			return 1;
		else if(numPing<2)
			return 0;
		else {
			return numPing/3+Ping(numPing/3+numPing%3);
		}
	}
}

二、明明的隨機數
明明想在學校中請一些同學一起做一項問卷調查,爲了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤1000),對於其中重複的數字,只保留一個,把其餘相同的數去掉,不同的數對應着不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成“去重”與“排序”的工作(同一個測試用例裏可能會有多組數據,希望大家能正確處理)。

Input Param
n 輸入隨機數的個數
inputArray n個隨機整數組成的數組

Return Value
OutputArray 輸出處理後的隨機整數

輸入描述:
輸入多行,先輸入隨機整數的個數,再輸入相應個數的整數

輸出描述:
返回多行,處理後的結果

思路:華爲的題一般不難,不用想着怎麼降低時間和空間複雜度,只需要用最簡單的方法做出來就可以了,以此省出時間爭取多做一道題。
這道題用的思路是先將數字排序,再把排好序中的數字從小到大去除重複數字後加入到arraylist中。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main{
	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);
		while(input.hasNext()) {
		int n = input.nextInt();
		int[] array = new int[n];
		for(int i=0;i<n;i++) {
			array[i]= input.nextInt();
		}
		Arrays.sort(array);
		ArrayList<Integer> arrayList = new ArrayList<Integer>();
		for(int i=0;i<n;i++) {
			
			arrayList.add(array[i]);
			while(i<n-1 &&array[i]==array[i+1])
				i++;
		}
		for(int i=0;i<arrayList.size();i++) {
			System.out.println(arrayList.get(i));
		}
		
		
		}
	}
}

三、進制轉換
寫出一個程序,接受一個十六進制的數,輸出該數值的十進制表示。(多組同時輸入 )
輸入描述:
輸入一個十六進制的數值字符串。

輸出描述:
輸出該數值的十進制字符串。

思路:還是一樣的,只需要用最簡單的方法做出來就行了。


import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);
		while(input.hasNext()) {
			String string = input.nextLine();
			char[] array = string.toCharArray();
			int weight=1;//每一位數字的權重,比如A1中,A就要乘16,那麼他的權重就是16
			int result=0;
			for(int i=array.length-1;i>1;i--) {//16進制前面有ox
				int num=0;
				switch (array[i]) {
				case 'A': num=10;break;
				case 'B': num=11;break;
				case 'C': num=12;break;
				case 'D': num=13;break;
				case 'E': num=14;break;
				case 'F': num=15;break;
				default: num =(int)array[i]-(int)('0');
				
				}
				result += num*weight;
				weight *= 16;
			}
			System.out.println(result);
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章