一、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])); }