日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2022.4.24腾讯笔试记录

發布時間:2023/12/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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題

題目描述

給出一個鏈表數組,該鏈表數組均是某一個環狀鏈表的一部分,請將這些鏈表組合并成環狀鏈表,然后需要找到一個位置,使得這個位置將環切開后,按照順序或逆序遍歷這個環,形成的鏈字典順序盡量小,并返回這條鏈。

  • 鏈表字典序的定義:對于兩個鏈表a,b,從頭節點到尾節點遍歷,找到第一個不相同的節點值,如果存在i使得a[i].val < b[i].val,那么就讓我a的字典序比較小。比如鏈表{1,2,3}<鏈表{1,2,4},鏈表{3,4,5}<鏈表{6,7}。
  • 環狀鏈表不存在相同的節點值
  • 該題環狀鏈表節點個數最小為2
  • 每個鏈表都是環狀鏈表上的順時針的一部分
  • 給定的鏈表數組一定能組成一個環狀鏈表
    (本題是核心模式)
  • 示例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腾讯笔试记录的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。