算法編程題

一、java

題目描述

對於一個字符串,請設計一個高效算法,找到第一次重複出現的字符。面試

給定一個字符串(不必定全爲字母)A及它的長度n。請返回第一個重複出現的字符。保證字符串中有重複字符,字符串的長度小於等於500。算法

測試樣例:數組

"qywyer23tdd",11
返回:y

分析:hashset不容許又重複元素加入。微信

import java.util.*;

public class FirstRepeat {
    public char findFirstRepeat(String A, int n) {
        char[] a=A.toCharArray();
		HashSet<Object> hs=new HashSet<>();
		
		for (int i = 0; i < n; i++) {
			boolean b=hs.add(a[i]);
			if (!b) {
				return a[i];
			}
		}
		
		return 0;
	}
	
    
}

二、函數

春節期間小明使用微信收到不少個紅包,很是開心。在查看領取紅包記錄時發現,某個紅包金額出現的次數超過了紅包總數的一半。請幫小明找到該紅包金額。寫出具體算法思路和代碼實現,要求算法儘量高效。測試

給定一個紅包的金額數組gifts及它的大小n,請返回所求紅包的金額。this

若沒有金額超過總數的一半,返回0。spa

測試樣例:設計

[1,2,3,2,2],5
返回:2

分析:先進行排序,當某個金額多於一半的時候,數組的中間值一定是多於一一半的值,注意考慮沒有超過一半的狀況,返回0。

import java.util.*;
 
public class Gift {
    public int getValue(int[] gifts, int n) {
        Arrays.sort(gifts);
            int ans = gifts[n/2];
            int num = 0;
            for(int i = 0; i < gifts.length; i++) {
                if(gifts[i] == ans) {
                    num++;
                }
            }
            return num <= n/2 ? 0 : ans;
    }
}

三、

請設計一個複雜度爲O(n)的算法,計算一個未排序數組中排序後相鄰元素的最大差值。

給定一個整數數組A和數組的大小n,請返回最大差值。保證數組元素個數大於等於2小於等於500。

測試樣例:

[9,3,1,10],4
返回:6

分析:數組長度等於2則直接返回兩者只和的絕對值,不然對數組內元素先進行排序,而後兩兩作差放進List,最後排序list,輸出最後一個元素即爲最大。

/**
     * 尋找最大差值
     * @param A
     * @param n
     * @return
     */
	public static int findMaxDivision(int[] A, int n) {
		int m=0;
		int a = 0;
		Arrays.sort(A);
		if (n==2) {
			return Math.abs(A[0]-A[1]);	
		}else {

			List temp=new ArrayList<>();
			for (int i = 0; i < n-1; i++) {
				m=Math.abs(A[i]-A[i+1]);
				temp.add(m);				
			}
			Collections.sort(temp);
			a=(int) temp.get(temp.size()-1);
			return a;	        
		}
	}

四、

題目描述

世界上有10種人,一種懂二進制,一種不懂。那麼你知道兩個int32整數m和n的二進制表達,有多少個位(bit)不一樣麼? 

輸入例子:

1999 2299

輸出例子:

7

分析:兩數作異或運算,0^1=1;1^0=1;1^1=0 即相同爲1,不一樣爲0,最後統計1的個數便可。

/**
     * 得到兩個整形二進制表達位數不一樣的數量
     * 
     * @param m 整數m
     * @param n 整數n
     * @return 整型
     */
    public int countBitDiff(int m, int n) {
      int s=m^n;
      int count=0;
        while(s>0){
            s=s&(s-1);
            count++;
        }
     return count;
    }

五、

題目描述

對於一個字符串,和字符串中的某一位置,請設計一個算法,將包括i位置在內的左側部分移動到右邊,將右側部分移動到左邊。

給定字符串A和它的長度n以及特定位置p,請返回旋轉後的結果。

測試樣例:

"ABCDEFGH",8,4
返回:"FGHABCDE"

分析:首先關鍵位置不能大於字符串長度,而後根據特定位置進行字符串截取便可。

public String rotateString(String A, int n, int p) {
        if (p>n) {
	    	return null;	
	    	}
	    	String str1=A.substring(0,p+1);
	    	String str2=A.substring(p+1, n);
	    	return str2+str1;
    }

六、

題目描述

小東和三個朋友一塊兒在樓上拋小球,他們站在樓房的不一樣層,假設小東站的樓層距離地面N米,球從他手裏自由落下,每次落地後反跳回上次下落高度的一半,並以此類推知道所有落到地面不跳,求4個小球一共通過了多少米?(數字都爲整數)

給定四個整數A,B,C,D,請返回所求結果。

測試樣例:

100,90,80,70
返回:1020

分析:首先不要對距離取整,也就是遇到小數的狀況取整會損失必定距離。不論是幾個小球,先拿一個來分析,假設第一次是N,第二次就是N/2,第三次是N/4,依次類推。能夠看出距離是一個首項是N,公比是1/2的等比數列,根據等比數列求和公式Sn=a1(1-q^n)/(1-q)這裏須要考慮極限的狀況,也就是小球反跳次數n無窮大時,q^n趨於0,因此求和公式變爲Sn=a1/(1-q),因此小球距離S=N+N/(1-1/2)=3N。

import java.util.*;

public class Balls {
    public int calcDistance(int A, int B, int C, int D) {
        return 3*(A+B+C+D);
    }
}

七、

題目描述

現定義數組單調和爲全部元素i的f(i)值之和。這裏的f(i)函數定義爲元素i左邊(不包括其自身)小於等於它的數字之和。請設計一個高效算法,計算數組的單調和。

給定一個數組A同時給定數組的大小n,請返回數組的單調和。保證數組大小小於等於500,同時保證單調和不會超過int範圍。

測試樣例:

[1,3,5,2,4,6],6
返回:27

分析:先來解釋一下題目,根據給的樣例,從數組的第一個元素開始1,左邊沒有元素。3左邊有一個元素且小於3,因此結果爲1,接下來是5,左邊兩個元素且都小於5,結果爲4,接下來是2,左邊有三個元素,但只有一個小於2,結果爲1,以此類推,最終結果爲1+4+1+6+15=27。

倒序取數組元素,而後判斷左邊元素是否小於它,小於的元素相加,最後再相加全部結果,時間複雜度爲O(n^2)

import java.util.*;

public class MonoSum {
    public int calcMonoSum(int[] A, int n) {
        int sum=0;
	    	for (int j = 0; j < n; j++) {				
	    		for (int i = n-2; i >= 0; i--) {
	    			if (A[i]<=A[n-1]) {
	    				System.out.println(A[i]);
	    				sum=sum+A[i];
	    			}
	    		}
	    		n--;
			}
		return sum;
    }
}

八、

有一個字符串例如「sdabisjabmla」,請計算相鄰「ab」的個數。

例如:輸入「sdabisjabmla」,判斷相鄰「ab」的個數,輸出1。

分析:判斷字符串不爲空,字符串長度等於2仍是小於2,仍是大於2.難度不大。主要是各類狀況的考慮。

/**
	  * 尋找相鄰字符串個數
	  * @param str
	  * @param same
	  * @return
	  */
	 public static int Samecount(String str,String same){
		 int count=0;
		 if (str==null) {
			return -1;
		 }else if (str.length()==2) {
			if (same.equals(str)) {
				return 1;
			}
		 }else if (str.length()>2) {
			for (int i = 0; i < str.length()-1; i++) {
				if (str.substring(i, i+2).equals(same)) {
					count++;
				}
			}
		 }else{
			return 0;
		 }
		 return count;
	 }

九、

給定一個字符串數組,例如{「this」,「is」,「a」,「dog」,「is」,「this」},請依次輸出每一個元素出現的次數,本例輸出

this:2

is:2

a:1

dog:1

分析:第一次作這個題目徹底想偏了,想着用hashset,後來面試官提示用hashmap,當時沒想起來,後來又想了想,能夠用hashmap的key存儲每一個元素,value存儲出現次數,每次存儲元素以前須要根據key檢查一下是否已經存在,存在的話就把value加1,最後按數組的元素順序查找map裏面的value並輸出。

/**
	  * 尋找數組元素每一個元素的出現次數並按出現順序輸出
	  * @param str
	  * @return
	  */
	 public static HashMap sameCount(String[] str){
		 HashMap<String, Integer> hm=new HashMap<>();
		 int count=0;
		 for (int i = 0; i < str.length; i++) {
			if (hm.containsKey(str[i])) {
				int c=hm.get(str[i]);
				hm.put(str[i],c+1);
			}else {
				hm.put(str[i],1);
			}
		}
		return hm;
	 }
//調用的時候
String[] s={"this","a","is","a","a","this"};
		HashMap map=sameCount(s);
		for (int i = 0; i < map.size(); i++) {
			System.out.println(s[i]+":"+map.get(s[i]));
		}
相關文章
相關標籤/搜索