Java算法:牛客网腾讯笔试真题算法Java版1-11题
生活随笔
收集整理的這篇文章主要介紹了
Java算法:牛客网腾讯笔试真题算法Java版1-11题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題號 題目 知識點 難度 通過率 QQ1 生成格雷碼 遞歸 簡單 22.61%QQ2 微信紅包 模擬 簡單 25.61%QQ3 編碼 字符串模擬 中等 26.60%QQ4 游戲任務標記 模擬 中等 37.55%QQ5 素數對 模擬 中等 31.58%QQ6 geohash編碼 模擬 中等 24.82%QQ7 拼湊硬幣 動態規劃 中等 22.25%QQ8 數字轉換機 貪心 中等 34.40%QQ9 魔法陣 計算幾何 簡單 39.06%QQ10 石子合并 中等 49.23%QQ11 小Q的排序 模擬 簡單 48.22%
QQ1 生成格雷碼
題目描述
在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進制數不同, 則稱這種編碼為格雷碼(Gray Code),請編寫一個函數,使用遞歸的方法生成N位的格雷碼。 給定一個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例:
1 返回:["0","1"] import java.util.Scanner; public class Main {public static String[] getGray(int n) {//總共需要的位數String[] grayCode = new String[(int) Math.pow(2, n)];if (n == 1) {//位數為1為遞歸結束情況,規律:/*1、除了最高位(左邊第一位),格雷碼的位元完全上下對稱(看下面列表)。比如第一個格雷碼與最后一個格雷碼對稱(除了第一位),第二個格雷碼與倒數第二個對稱,以此類推。2、最小的重復單元是 0 , 1。000001011010110111101100*/grayCode[0] = "0";grayCode[1] = "1";return grayCode;}//遞歸前n-1的格雷碼 String[] last = getGray(n - 1);//格雷碼計算方式,前一次格雷碼分兩部分,假設01for (int i = 0; i < last.length; i++) {grayCode[i] = "0" + last[i];//前半部分的二進制碼前加 0grayCode[grayCode.length - i - 1] = "1" + last[i];//后半部分的二進制碼前加1}return grayCode;}public static void main(String[] args) {Scanner in = new Scanner(System.in);int b;while (in.hasNext()) {b = in.nextInt();String[] strings = getGray(b);System.out.print("[");int c = strings.length;for (int i = 0; i < c - 1; i++) {System.out.print("\"" + strings[i] + "\",");}System.out.print("\"" + strings[c - 1] + "\"");System.out.println("]");}} }QQ2 微信紅包
題目描述
春節期間小明使用微信收到很多個紅包,非常開心。在查看領取紅包記錄時發現,某個紅包金額出現的次數超過了紅包總數的一半。請幫小明找到該紅包金額。寫出具體算法思路和代碼實現,要求算法盡可能高效。 給定一個紅包的金額數組gifts及它的大小n,請返回所求紅包的金額。 若沒有金額超過總數的一半,返回0。測試樣例:
[1,2,3,2,2],5返回
2 import java.util.*; public class Gift {public int getValue(int[] gifts, int n) {int count = 0;int res = gifts[0];for (int num : gifts) {if (num == res) count++;else count--;if (count == 0) res = num;}if (count > 0) return res;else return 0;} }QQ3 編碼
題目描述
假定一種編碼的編碼范圍是a ~ y的25個字母,從1位到4位的編碼,如果我們把該編碼按字典序排序,形成一個數組如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index為0,aa的Index為1,aaa的Index為2,以此類推。 編寫一個函數,輸入是任意一個編碼,輸出這個編碼對應的Index.輸入描述:
輸入一個待編碼的字符串,字符串長度小于等于100.輸出描述:
輸出這個編碼的index示例1
輸入
baca輸出
16331 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String str;while ((str = reader.readLine()) != null) {char[] chars = str.trim().toCharArray();int temp = 0, sum = 0;for (int i = 0; i < 4; i++) {temp *= 25;if (i < chars.length) temp += chars[i] - 'a';sum += temp;if (i < chars.length - 1) sum += 1;}System.out.println(sum);}} }QQ4 游戲任務標記
題目描述
游戲里面有很多各式各樣的任務,其中有一種任務玩家只能做一次,這類任務一共有1024個,任務ID范圍[1,1024]。請用32個unsigned int類型來記錄著1024個任務是否已經完成。初始狀態都是未完成。 輸入兩個參數,都是任務ID,需要設置第一個ID的任務為已經完成;并檢查第二個ID的任務是否已經完成。 輸出一個參數,如果第二個ID的任務已經完成輸出1,如果未完成輸出0。如果第一或第二個ID不在[1,1024]范圍,則輸出-1。輸入描述:
輸入包括一行,兩個整數表示人物ID.輸出描述:
輸出是否完成示例1
輸入
1024 1024輸出
1 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.Math; public class Main {private static int[] s = new int[32];private static int testId(int set, int check) {//ID檢查if (set > 1024 || check > 1024) return -1;// index 為int數組的下標(0~31) bit為int變量的第幾位(0~31) 例如 1--s[1]=2^31int set_index = (set - 1) / 32;int set_bit = set % 32;int check_index = (check - 1) / 32;int check_bit = 32 * (check_index + 1) - check;//設置第一個ID任務完成s[set_index] = s[set_index] | (int) Math.pow(2, set_bit);// 檢查第二個任務是否完成if ((s[check_index] & (int) Math.pow(2, check_bit)) != 0) return 1;else return 0;}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] str = br.readLine().split(" ");int set = Integer.parseInt(str[0]);int check = Integer.parseInt(str[1]);System.out.println(testId(set, check));} }QQ5 素數對
題目描述
給定一個正整數,編寫程序計算有多少對質數的和等于輸入的這個正整數,并輸出結果。輸入值小于1000。 如,輸入為10, 程序應該輸出結果為2。(共有兩對質數的和為10,分別為(5,5),(3,7))輸入描述:
輸入包括一個整數n,(3 ≤ n < 1000)輸出描述:
輸出對數示例1
輸入
10輸出
2 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main {public static void main(String[] args) throws NumberFormatException, IOException {BufferedReader beader = new BufferedReader(new InputStreamReader(System.in));int target = Integer.parseInt(beader.readLine());int[] numbs = new int[target];int count = 0;int result = 0;for (int i = 2; i <= target; i++) {int judge = 0;for (int j = 2; j < i; j++) {if (i % j == 0) {judge = 1;break;}}if (judge == 0) {numbs[count] = i;count++;}}for (int i = 0; i < count - 1; i++) {for (int j = i; j < count; j++) {if ((numbs[i] + numbs[j]) == target) {result++;break;}}}System.out.println(result);} }QQ6 geohash編碼
題目描述
geohash編碼:geohash常用于將二維的經緯度轉換為字符串,分為兩步:第一步是經緯度的二進制編碼,第二步是base32轉碼。 此題考察緯度的二進制編碼:算法對緯度[-90, 90]通過二分法進行無限逼近(取決于所需精度,本題精度為6)。注意,本題進行二分法逼近過程中只采用向下取整來進行二分,針對二分中間值屬于右區間。算法舉例如下: 針對緯度為80進行二進制編碼過程: 1) 區間[-90, 90]進行二分為[-90, 0),[0, 90],成為左右區間,可以確定80為右區間,標記為1; 2) 針對上一步的右區間[0, 90]進行二分為[0, 45),[45, 90],可以確定80是右區間,標記為1; 3) 針對[45, 90]進行二分為[45, 67),[67,90],可以確定80為右區間,標記為1; 4) 針對[67,90]進行二分為[67, 78),[78,90],可以確定80為右區間,標記為1; 5) 針對[78, 90]進行二分為[78, 84),[84, 90],可以確定80為左區間,標記為0; 6) 針對[78, 84)進行二分為[78, 81), [81, 84),可以確定80為左區間,標記為0;輸入描述:
輸入包括一個整數n,(-90 ≤ n ≤ 90)輸出描述:
輸出二進制編碼示例1
輸入
80輸出
111100 import java.io.*; public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str;final int TIMES = 6;while ((str = br.readLine()) != null) {if (str.equals("")) continue;int num = Integer.parseInt(str);StringBuilder ans = new StringBuilder();int left = -90, right = 90;for (int i = 0; i < TIMES; i++) {int mid = (left + right) / 2;if (num >= mid) {left = mid;ans.append('1');} else {right = mid;ans.append('0');}}System.out.println(ans);}} }QQ7 拼湊硬幣
題目描述
小Q十分富有,擁有非常多的硬幣,小Q擁有的硬幣是有規律的,對于所有的非負整數K,小Q恰好各有兩個面值為2^K的硬幣,所以小Q擁有的硬幣就是1,1,2,2,4,4,8,8,…。小Q有一天去商店購買東西需要支付n元錢,小Q想知道有多少種方案從他擁有的硬幣中選取一些拼湊起來恰好是n元(如果兩種方案某個面值的硬幣選取的個數不一樣就考慮為不一樣的方案)。輸入描述:
輸入包括一個整數n(1≤n≤10^18),表示小Q需要支付多少錢。注意n的范圍。輸出描述:
輸出一個整數,表示小Q可以拼湊出n元錢放的方案數。示例1
輸入
6輸出
3 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));long n = Long.parseLong(br.readLine());Map<Long, Long> map = new HashMap<>();map.put(0L, 1L);map.put(1L, 1L);System.out.println(solution(n, map));}private static long solution(Long n, Map<Long, Long> map) {if (map.containsKey(n)) return map.get(n);long cnt;//偶數if ((n & 1) == 0) cnt = solution(n >> 1, map) + solution((n >> 1) - 1, map);else cnt = solution(n >> 1, map);map.put(n, cnt);return cnt;} }QQ8 數字轉換機
題目描述
小Q從牛博士那里獲得了一個數字轉換機,這臺數字轉換機必須同時輸入兩個正數a和b,并且這臺數字轉換機有一個紅色的按鈕和一個藍色的按鈕: 當按下了紅色按鈕,兩個數字同時加1。 當按下了藍色按鈕,兩個數字同時乘2。 小Q現在手中有四個整數a,b,A,B,他希望將輸入的兩個整數a和b變成A,B(a對應A,b對應B)。因為牛博士允許小Q使用數字轉換機的時間有限,所以小Q希望按動按鈕的次數越少越好。請你幫幫小Q吧。輸入描述:
輸入包括一行,一行中有四個正整數a,b,A,B,(1≤a,b,A,B≤10^9)。輸出描述:
如果小Q可以完成轉換,輸出最少需要按動按鈕的次數,否則輸出-1。示例1
輸入
100 1000 202 2002輸出
2 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] str = br.readLine().split(" ");int a = Integer.parseInt(str[0]);int b = Integer.parseInt(str[1]);int A = Integer.parseInt(str[2]);int B = Integer.parseInt(str[3]);System.out.println(solution(a, b, A, B));}private static int solution(int a, int b, int A, int B) {if (a == A && b == B) return 0;else if (a != A && b == B) return -1;else if (a == A) return -1;else if (a > A || b > B) return -1;int res;if ((A & 1) == 0 && (B & 1) == 0) res = solution(a, b, A / 2, B / 2);else res = solution(a, b, A - 1, B - 1);if (res == -1) return -1;return res + 1;} }QQ9 魔法陣
題目描述
小Q搜尋了整個魔法世界找到了四塊魔法石所在地,當4塊魔法石正好能構成一個正方形的時候將啟動魔法陣,小Q就可以借此實現一個愿望。 現在給出四塊魔法石所在的坐標,小Q想知道他是否能啟動魔法陣輸入描述:
輸入的第一行包括一個整數(1≤T≤5)表示一共有T組數據 每組數據的第一行包括四個整數x[i](0≤x[i]≤10000),即每塊魔法石所在的橫坐標 每組數據的第二行包括四個整數y[i](0≤y[i]≤10000),即每塊魔法石所在的縱坐標輸出描述:
對于每組數據,如果能啟動魔法陣輸出“Yes”否則輸出“No”。示例1
輸入
3 0022 0202 0156 1605 0077 0303輸出
Yes Yes No import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.LinkedList; import java.util.List; public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());for (int i = 0; i < n; i++) {char[] x = br.readLine().toCharArray();char[] y = br.readLine().toCharArray();System.out.println(solution(x, y));}}private static String solution(char[] x, char[] y) {int[] t = new int[3];for (int i = 1; i < 4; i++) {t[i - 1] = ((x[i] - x[0]) * (x[i] - x[0]) + (y[i] - y[0]) * (y[i] - y[0]));}Arrays.sort(t);if (t[0] == t[1] && t[0] + t[1] == t[2]) return "yes";return "No";} }QQ10 石子合并
題目描述
小Q和牛博士在玩一個石子合并的游戲,初始一共有n堆石子,每堆石子有w[i]個石子。小Q和牛博士他們需要對石子堆進行合并,每次他們可以任意選擇兩堆石子進行合并。一堆有x個石子的石子堆和一堆有y個石子的石子堆合并將得到一堆x+y個石子的石子堆,這次合并得分為x*y,當只剩下一堆石子的時候游戲結束。 、小Q和牛博士希望采取優秀的策略獲得最大得分,希望你能來幫他們算算最大得分多少。輸入描述:
輸入包括兩行,第一行一個正整數n(2≤n≤100)。 第二行包括n個正整數w[i](1≤w[i]≤100),即每堆石子的個數。輸出描述:
輸出一個正整數,即小Q和牛博士最大得分是多少。示例1
輸入
3 1 2 3輸出
11 import java.io.*; import java.util.*; import java.lang.*; public class Main {public static void main(String[] args) throws IOException {BufferedReader read = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(read.readLine());String[] str = read.readLine().split(" ");int[] num = new int[n];for (int i = 0; i < n; i++) num[i] = Integer.parseInt(str[i]);int grade;int count = 0;int sum = 0;for (int i = num.length - 1; i >= 0; i--) {grade = count * num[i];sum = sum + grade;count += num[i];}System.out.println(sum);} }QQ11 小Q的排序
題目描述
小Q在學習許多排序算法之后靈機一動決定自己發明一種排序算法,小Q希望能將n個不同的數排序為升序。小Q發明的排序算法在每輪允許兩種操作: 1、 將當前序列中前n-1個數排為升序 2、 將當前序列中后n-1個數排為升序 小Q可以任意次使用上述兩種操作,小Q現在想考考你最少需要幾次上述操作可以讓序列變為升序。輸入描述:
輸入包括兩行,第一行包括一個正整數n(3≤n≤10^5),表示數字的個數 第二行包括n個正整數a[i](1≤a[i]≤10^9),即需要排序的數字,保證數字各不相同。輸出描述:
輸出一個正整數,表示最少需要的操作次數示例1
輸入
6 4 3 1 6 2 5輸出
2 import java.util.*; import java.io.*; public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String s;while ((s = br.readLine()) != null) {int N = Integer.parseInt(s);String[] arr = br.readLine().split(" ");int[] a = new int[N];for (int i = 0; i < N; i++) {a[i] = Integer.parseInt(arr[i]);}int minIndex = 0;int maxIndex = 0;int min = 0;int max = 0;for (int i = 0; i < N; i++) {if (min > a[i]) {min = a[i];minIndex = i;}if (max < a[i]) {max = a[i];maxIndex = i;}}if (minIndex == N - 1 && maxIndex == 0) System.out.println("3");else if (minIndex != N - 1 && maxIndex != 0) System.out.println("2");else System.out.println("1");}} }總結
以上是生活随笔為你收集整理的Java算法:牛客网腾讯笔试真题算法Java版1-11题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ajax suggest,ajax Su
- 下一篇: [Java]-Elastic中sugge