2022.4.24腾讯笔试记录
騰訊筆試是五道題目,兩個小時。
3道ACM模式,兩道核心代碼模式。
第1題
題目描述
有n個長度相等由數字組成的字符串,從上往下讀,并排序,輸出新的數字字符串,去掉前導0。
示例1
輸入
3 0123 1234 2345輸出
12 123 234 345思路分析
簡單的字符串拆分拼接,以及list排序。
參考代碼
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner;public class Main1 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();in.nextLine();String[] str = new String[n];for (int i = 0; i < n; i++) {str[i] = in.nextLine();}int m = str[0].length();List<Integer> list = new ArrayList<>();for (int i = 0; i < m; i++) {String num = "";for (int j = 0; j < n; j++) {num += str[j].charAt(i);}list.add(Integer.parseInt(num));}Collections.sort(list);for (int i = 0; i < list.size(); i++) {if (i == list.size() - 1) {System.out.println(list.get(i));} else {System.out.print(list.get(i) + " ");}}} }第2題
題目描述
一個長度為n的數組a,數組下標從1~n。每一次將a中所有下標為非質數的元素進行刪除,即ai且i不為質數。在刪完之后,將數組a重新按順序拼接起來,不斷循環,直到數組大小為1,計算數組最后剩下的元素的值。
注:1不是質數
(本題是核心模式)
示例1
輸入
[1,2,3,4]輸出
3思路分析
本題是核心代碼模式,這里自己寫了輸入進行測試。首先判斷索引是不是質數,是質數的對應的索引-1加入list。然后循環計算。
參考代碼
import java.util.ArrayList; import java.util.List;public class Main2 {public static void main(String[] args) {int a[] = new int[]{1,2,3,4};System.out.println(getNumber(a));}public static int getNumber(int[] a) {int n = a.length;List<Integer> list = new ArrayList<>();for (int i = 2; i < n; i++) {if (isPrime(i)) { // 將質數索引加入listlist.add(i - 1);}}while (n != 1) {int k = 0;for (int i = 0; i < list.size() && list.get(i) < n; i++) {a[k++] = a[list.get(i)];}n = k;}return a[0];}public static boolean isPrime(int x){ // 判斷是不是質數int m = (int)(Math.sqrt(x) + 1);for (int i = 2; i < m; i++) {if (x % i == 0) {return false;}}return true;} }第3題
題目描述
有n個戰士站成1排,編號為1,2……n,戰士的戰斗力等于編號,一些戰士只會進攻,一些戰士只會防守,將他們從某個點分成兩個陣營,假設這個點為pos,則0~pos的是進攻組,只算攻擊力,pos+1~n的是防御組,只算防御力。pos可以取0~n。假設第一個陣營中進攻的戰力總和為w,第二個陣營防守戰力總和為v,求|w-v|最小值。
輸入描述
第一行輸入一個整數n,表示戰士數量
第二行給一個字符串s,僅由0和1組成,0代表進攻,1代表防守。
輸出描述
輸出|w-v|最小值
示例1
輸入
4 0011輸出
1思路分析
前綴和,計算進攻方的戰力總和,防守方的戰力總和,再逐個求差值絕對值最小值。注意全進攻和全防守的情況。
參考代碼
import java.util.Scanner;public class Main3 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();in.nextLine();String str = in.nextLine();long[] a = new long[n + 1];long[] d = new long[n + 1];for (int i = 1; i <= n; i++) {a[i] = a[i - 1];d[i] = d[i - 1];if (str.charAt(i - 1) == '0') {a[i] += i;} else {d[i] += i;}}long res = Math.min(a[n], d[n]); // 全進攻全防守for (int i = 1; i < n; i++) {res = Math.min(res, Math.abs(a[i] - (d[n] - d[i])));}System.out.println(res);} }第4題
題目描述
給出一個鏈表數組,該鏈表數組均是某一個環狀鏈表的一部分,請將這些鏈表組合并成環狀鏈表,然后需要找到一個位置,使得這個位置將環切開后,按照順序或逆序遍歷這個環,形成的鏈字典順序盡量小,并返回這條鏈。
(本題是核心模式)
示例1
輸入
[{1,2,3},{2,3,4},{4,1}]輸出
{1,2,3,4}示例2
輸入
[{3,7,4},{7,4,5,1,10,3}]輸出
{1,5,4,7,3,10}思路分析
鏈表中結點的值唯一,使用哈希表記錄結點的前驅和后繼,并記錄最小值,然后從最小值開始遍歷,并判斷最小值的前驅和后繼哪個更小,從更小的開始順序遍歷。
參考代碼
import java.util.*;class ListNode {int val;ListNode next = null;public ListNode(int val) {this.val = val;} }public class Main4 {public ListNode solve (ListNode[] a) {// write code hereMap<ListNode, ListNode> map = new HashMap<>();Map<Integer, ListNode> map2 = new HashMap<>();for (ListNode node : a) {ListNode pre = map2.computeIfAbsent(node.val, v -> new ListNode(v));node = node.next;while (node != null) {ListNode mNode = map2.computeIfAbsent(node.val, v -> new ListNode(v));map.put(pre, mNode);pre = mNode;node = node.next;}}for (Map.Entry<ListNode, ListNode> entry : map.entrySet()) { // 對哈希表進行排序entry.getKey().next = entry.getValue();}ListNode head = map2.get(a[0].val);ListNode minNode = head;ListNode p = head.next;while (p != head) {if (p.val < minNode.val) {minNode = p;}p = p.next;}// 找到minNode最后的節點ListNode node = minNode;while (node.next != minNode) {node = node.next;}int preVal = node.val;ListNode next = minNode.next;if (next.val < preVal) {node.next = null;return minNode;}else {// 反轉鏈表minNode.next = null;reverse(next);return minNode;}}private void reverse(ListNode head) {ListNode pre = null;while (head != null) {ListNode next = head.next;head.next = pre;pre = head;head = next;}} }參考:騰訊4.24筆試
第5題
題目描述
現有一長度為n的數組a,表示每支股票的價格,每天最多買入或賣出該支股票的1手股票,買入或賣出沒有手續費,且賣出股票前必須手里已經有股票才能賣出,但是持有的股票數目不受限制,并且初始資金為m元,在任意時刻不能進行透支,所以資金必須始終大于等于0,請問在n天結束后,擁有最大總資產是多少?(最大總資產為持有現金+持有的股票價格)
輸入描述
第一行兩個整數,n,m
第二行n個整數{ai},其中ai表示股票在第i天的售價
輸出描述
輸出n天結束后,擁有最大總資產
示例1
輸入
6 2 2 3 1 1 1 2輸出
6說明
第1天買入1手,第2天賣出1手,第3,4,5天都買入1手,最后總持有3手股票,股票價格為2,總資產為6
示例2
輸入
3 2 1 1 4輸出
8說明
第一天買入,第二天買入,第三天繼續持有,總共持有兩手股票,股票價格為4,總資產為8
示例3
輸入
3 100 10 9 8輸出
100說明
股票一直在下跌,都不買入,現金為100,股票為0,總資產為0
思路分析
看到股票問題,首先想到leetcode上的股票買賣問題,122. 買賣股票的最佳時機 II,但不同的是,買賣股票的最佳時機 II中在任何時候 最多 只能持有 一股 股票。而本題中同一時刻可以持有多手股票。
但思路相同,動態規劃求解。
設dp[i][j]為第i天持有j個股票能擁有的最大現金。
每天的操作有3種,無操作,買入1手,賣出1手。買入的時候有限制條件,不能透支。則dp[i][j] = Math.min(dp[i-1][j] , dp[i][j+1] +prices[i] , dp[i][j-1]-prices[i])
需要注意的是,股票的價格可能很大,所以定義dp數組為long。
參考代碼
import java.util.*;public class Main5 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int N = in.nextInt();int price = in.nextInt();int[] prices = new int[N];for (int i = 0; i < N; i++) {prices[i] = in.nextInt();}long[][] dp = new long[N][N]; // 注意這里定義為long// dp[i][j]為第i天持有j個股票能擁有的最大現金額度,n天最多n-1支股票Arrays.fill(dp[0], -1);dp[0][0] = price; // 第0天,0注股票price元if (price >= prices[0]) {dp[0][1] = price - prices[0];}for (int i = 1; i < N; i++) {for (int j = 0; j < N; j++) {dp[i][j] = dp[i - 1][j]; // 無操作,不買入也不賣出if (j > 0) { // 買入1注,且金額足夠if (dp[i - 1][j - 1] != -1 && dp[i - 1][j - 1] >= prices[i]) {dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] - prices[i]);}}if (j < N - 1) { // 賣出1注if (dp[i - 1][j + 1] != -1) {dp[i][j] = Math.max(dp[i][j], dp[i - 1][j + 1] + prices[i]);}}}}long res = 0;for (int i = 0; i < N; i++) {if (dp[N - 1][i] == -1) continue;res = Math.max(res, dp[N - 1][i] + i * prices[N - 1]);}System.out.println(res);} }總結
以上是生活随笔為你收集整理的2022.4.24腾讯笔试记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑出现我们在加载您的信息流时遇到了问题
- 下一篇: 【本周最新】qlv转mp4格式转换器 工