日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

2022.4.24腾讯笔试记录

發(fā)布時(shí)間:2023/12/16 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2022.4.24腾讯笔试记录 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

騰訊筆試是五道題目,兩個(gè)小時(shí)。

3道ACM模式,兩道核心代碼模式。

第1題

題目描述

有n個(gè)長(zhǎng)度相等由數(shù)字組成的字符串,從上往下讀,并排序,輸出新的數(shù)字字符串,去掉前導(dǎo)0。

示例1

輸入

3 0123 1234 2345

輸出

12 123 234 345

思路分析

簡(jiǎn)單的字符串拆分拼接,以及l(fā)ist排序。

參考代碼

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題

題目描述

一個(gè)長(zhǎng)度為n的數(shù)組a,數(shù)組下標(biāo)從1~n。每一次將a中所有下標(biāo)為非質(zhì)數(shù)的元素進(jìn)行刪除,即ai且i不為質(zhì)數(shù)。在刪完之后,將數(shù)組a重新按順序拼接起來(lái),不斷循環(huán),直到數(shù)組大小為1,計(jì)算數(shù)組最后剩下的元素的值。

注:1不是質(zhì)數(shù)
(本題是核心模式)

示例1

輸入

[1,2,3,4]

輸出

3

思路分析

本題是核心代碼模式,這里自己寫(xiě)了輸入進(jìn)行測(cè)試。首先判斷索引是不是質(zhì)數(shù),是質(zhì)數(shù)的對(duì)應(yīng)的索引-1加入list。然后循環(huán)計(jì)算。

參考代碼

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)) { // 將質(zhì)數(shù)索引加入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){ // 判斷是不是質(zhì)數(shù)int m = (int)(Math.sqrt(x) + 1);for (int i = 2; i < m; i++) {if (x % i == 0) {return false;}}return true;} }

第3題

題目描述

有n個(gè)戰(zhàn)士站成1排,編號(hào)為1,2……n,戰(zhàn)士的戰(zhàn)斗力等于編號(hào),一些戰(zhàn)士只會(huì)進(jìn)攻,一些戰(zhàn)士只會(huì)防守,將他們從某個(gè)點(diǎn)分成兩個(gè)陣營(yíng),假設(shè)這個(gè)點(diǎn)為pos,則0~pos的是進(jìn)攻組,只算攻擊力,pos+1~n的是防御組,只算防御力。pos可以取0~n。假設(shè)第一個(gè)陣營(yíng)中進(jìn)攻的戰(zhàn)力總和為w,第二個(gè)陣營(yíng)防守戰(zhàn)力總和為v,求|w-v|最小值。

輸入描述

第一行輸入一個(gè)整數(shù)n,表示戰(zhàn)士數(shù)量

第二行給一個(gè)字符串s,僅由0和1組成,0代表進(jìn)攻,1代表防守。

輸出描述

輸出|w-v|最小值

示例1

輸入

4 0011

輸出

1

思路分析

前綴和,計(jì)算進(jìn)攻方的戰(zhàn)力總和,防守方的戰(zhàn)力總和,再逐個(gè)求差值絕對(duì)值最小值。注意全進(jìn)攻和全防守的情況。

參考代碼

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]); // 全進(jì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題

題目描述

給出一個(gè)鏈表數(shù)組,該鏈表數(shù)組均是某一個(gè)環(huán)狀鏈表的一部分,請(qǐng)將這些鏈表組合并成環(huán)狀鏈表,然后需要找到一個(gè)位置,使得這個(gè)位置將環(huán)切開(kāi)后,按照順序或逆序遍歷這個(gè)環(huán),形成的鏈字典順序盡量小,并返回這條鏈。

  • 鏈表字典序的定義:對(duì)于兩個(gè)鏈表a,b,從頭節(jié)點(diǎn)到尾節(jié)點(diǎn)遍歷,找到第一個(gè)不相同的節(jié)點(diǎn)值,如果存在i使得a[i].val < b[i].val,那么就讓我a的字典序比較小。比如鏈表{1,2,3}<鏈表{1,2,4},鏈表{3,4,5}<鏈表{6,7}。
  • 環(huán)狀鏈表不存在相同的節(jié)點(diǎn)值
  • 該題環(huán)狀鏈表節(jié)點(diǎn)個(gè)數(shù)最小為2
  • 每個(gè)鏈表都是環(huán)狀鏈表上的順時(shí)針的一部分
  • 給定的鏈表數(shù)組一定能組成一個(gè)環(huán)狀鏈表
    (本題是核心模式)
  • 示例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}

    思路分析

    鏈表中結(jié)點(diǎn)的值唯一,使用哈希表記錄結(jié)點(diǎn)的前驅(qū)和后繼,并記錄最小值,然后從最小值開(kāi)始遍歷,并判斷最小值的前驅(qū)和后繼哪個(gè)更小,從更小的開(kāi)始順序遍歷。

    參考代碼

    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()) { // 對(duì)哈希表進(jìn)行排序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最后的節(jié)點(diǎn)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 {// 反轉(zhuǎn)鏈表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題

    題目描述

    現(xiàn)有一長(zhǎng)度為n的數(shù)組a,表示每支股票的價(jià)格,每天最多買入或賣出該支股票的1手股票,買入或賣出沒(méi)有手續(xù)費(fèi),且賣出股票前必須手里已經(jīng)有股票才能賣出,但是持有的股票數(shù)目不受限制,并且初始資金為m元,在任意時(shí)刻不能進(jìn)行透支,所以資金必須始終大于等于0,請(qǐng)問(wèn)在n天結(jié)束后,擁有最大總資產(chǎn)是多少?(最大總資產(chǎn)為持有現(xiàn)金+持有的股票價(jià)格)

    輸入描述

    第一行兩個(gè)整數(shù),n,m
    第二行n個(gè)整數(shù){ai},其中ai表示股票在第i天的售價(jià)

    輸出描述

    輸出n天結(jié)束后,擁有最大總資產(chǎn)

    示例1

    輸入

    6 2 2 3 1 1 1 2

    輸出

    6

    說(shuō)明

    第1天買入1手,第2天賣出1手,第3,4,5天都買入1手,最后總持有3手股票,股票價(jià)格為2,總資產(chǎn)為6

    示例2

    輸入

    3 2 1 1 4

    輸出

    8

    說(shuō)明

    第一天買入,第二天買入,第三天繼續(xù)持有,總共持有兩手股票,股票價(jià)格為4,總資產(chǎn)為8

    示例3

    輸入

    3 100 10 9 8

    輸出

    100

    說(shuō)明

    股票一直在下跌,都不買入,現(xiàn)金為100,股票為0,總資產(chǎn)為0

    思路分析

    看到股票問(wèn)題,首先想到leetcode上的股票買賣問(wèn)題,122. 買賣股票的最佳時(shí)機(jī) II,但不同的是,買賣股票的最佳時(shí)機(jī) II中在任何時(shí)候 最多 只能持有 一股 股票。而本題中同一時(shí)刻可以持有多手股票。

    但思路相同,動(dòng)態(tài)規(guī)劃求解。

    設(shè)dp[i][j]為第i天持有j個(gè)股票能擁有的最大現(xiàn)金。

    每天的操作有3種,無(wú)操作,買入1手,賣出1手。買入的時(shí)候有限制條件,不能透支。則dp[i][j] = Math.min(dp[i-1][j] , dp[i][j+1] +prices[i] , dp[i][j-1]-prices[i])

    需要注意的是,股票的價(jià)格可能很大,所以定義dp數(shù)組為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個(gè)股票能擁有的最大現(xiàn)金額度,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]; // 無(wú)操作,不買入也不賣出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);} }

    總結(jié)

    以上是生活随笔為你收集整理的2022.4.24腾讯笔试记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。