【筆試真題】2024秋招京東后端開發崗位-第一批筆試

31.牛牛與切割機

有一個序列 a1,a2,...,ana_1,a_2,...,a_na1?,a2?,...,an? , 牛牛將對這個序列切割一刀(劃分分成兩個不相交的非空序列,一個序列為 a1,...,apa_1,...,a_pa1?,...,ap?,另一個序列為 ap+1,...,ana_{p+1},...,a_nap+1?,...,an?),牛牛切割的代價為兩個序列元素和的乘積。牛牛想知道切割代價最小是多少。

時間限制:C/C++ 1秒,其他語言2秒

空間限制:C/C++ 256M,其他語言512M

輸入描述:

在這里插入圖片描述

輸出描述:

輸出一個整數表示切割代價最小是多少。

示例1

輸入例子:

5
1 2 3 4 5

輸出例子:

14

例子說明:

序列被劃分為1 和 2 3 4 5,右邊和為 14。

示例2

輸入例子:

4
2 1 3 4

輸出例子:

16

例子說明:

序列被劃分為 2 和 1 3 4。

解決方法

讀題后發現應該使用前綴和來解決。

  1. 預處理:計算前綴和與后綴和

    • 前綴和數組 LL[i] 表示數組前 i+1 個元素的和(即 nums[0] + nums[1] + ... + nums[i])。
    • 后綴和數組 RR[i] 表示數組從 i 到末尾的元素和(即 nums[i] + nums[i+1] + ... + nums[n-1])。

    通過預處理,可在 O(1) 時間內獲取任意分割點的兩部分元素和。

  2. 遍歷所有分割點,計算最小乘積
    對于每個可能的分割點 i(將數組分為 [0, i][i+1, n-1]),兩部分的和分別為 L[i]R[i+1],乘積為 L[i] * R[i+1]。遍歷所有分割點,記錄最小乘積即可。

import java.util.Scanner;// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int[] nums = new int[n];for(int i = 0;i<n;i++){nums[i] = in.nextInt();}long[] L = new long[n];long[] R = new long[n];L[0] = nums[0];R[n-1]=nums[n-1];for(int i = 1;i<n;i++){L[i] = L[i-1]+nums[i];}for(int i = n-2;i>=0;i--){R[i] = R[i+1]+nums[i];}long res = Long.MAX_VALUE;for(int i = 0;i<n-1;i++){long curres = L[i]*R[i+1];res= Math.min(res,curres);}System.out.println(res);}
}

32.字符串排序

給定 nnn 個字符串,請你對這 nnn個字符串按照以下規則從小到大排序。

對于任意兩個字符串 sssttt ,在排序后應當滿足:

- 若 s是 t 的一個前綴,則 s 在排序后的下標小于等于 t的在排序后的下標。
- 若存在整數 i ,使得 s 的前 i?1 個字符和 t 的前 i?1 個字符相同,且s 和 t 的第 i個字符不同,則比較第 i個字符的大小關系(字符的大小關系順序由輸入數據給出)。若 s 的第i個字符小于等于 t的第 i個字符,則 s 在排序后的下標小于等于 t 的在排序后的下標。

容易發現,上述排序方法的排序結果是唯一的。

時間限制:C/C++ 1秒,其他語言2秒

空間限制:C/C++ 256M,其他語言512M

輸入描述:

第一行輸入一個字符串,包含 26 個互不相同的小寫字母。記 rank(c) 表示字母c 是該字符串的第rank(c)個字符,則字母 a小于等于字母b當且僅當rank(a)≤rank(b)  。第二行輸入一個整數(1≤n≤1000) ,表示待排序字符串的數量。接下來n行,每行一個僅包含小寫字母的字符串si(|si|≤1000),表示一個待排序的字符串。

輸出描述:

按照排序后字符串位置下標從小到大的順序輸出n 行,每行一個字符串,表示排序的結果。

示例1

輸入例子:

abcdefghijklmnopqrstuvwxyz
3
aaa
aac
aaaa

輸出例子:

aaa
aaaa
aac

示例2

輸入例子:

zyxwvutsrqponmlkjihgfedcba
3
aaa
aac
aaaa

輸出例子:

aac
aaa
aaaa

解決方法

  1. 建立優先級映射:用哈希表 mp 存儲每個字符對應的優先級(索引值),索引越小優先級越高(例如 priorityStr"bac" 時,'b' 優先級為 0,'a' 為 1,'c' 為 2)。

  2. 自定義排序規則:通過Collections.sort

    結合比較器,按照以下邏輯排序字符串:

    • 逐字符比較兩個字符串,找到第一個不同的字符,根據它們在哈希表中的優先級值決定順序(優先級高的字符所在字符串排前面)。
    • 若較短字符串是較長字符串的前綴(如 "abc""abcd"),則較短字符串排前面。
import java.util.Scanner;
import java.util.*;// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String priorityStr = sc.nextLine();int n = Integer.parseInt(sc.nextLine());Map<Character,Integer> mp = new HashMap<>();for(int i = 0;i<priorityStr.length();i++){mp.put(priorityStr.charAt(i),i);}List<String> strs = new ArrayList<>();for(int i = 0;i<n;i++){strs.add(sc.nextLine());}Collections.sort(strs,(a,b)->{int an = a.length();int bn = b.length();int minLen = Math.min(an,bn);for(int i = 0;i<minLen;i++){char cA = a.charAt(i);char cB = b.charAt(i);if(cA != cB){return mp.get(cA)-mp.get(cB);}}return a.length()-b.length();});for(String str: strs){System.out.println(str);}}
}

33.牛牛的糖果樹

牛牛的朋友送了她一棵節點數為 nn的糖果樹(1號點為根節點),樹上的每個糖果都有一個顏色。

牛牛吃糖果有一個習慣,她每次都會吃掉一整個子樹的糖果,她喜歡與眾不同,所以每次吃之前她都會把出現次數最多的顏色的糖果扔掉(可能有多個出現次數最多的顏色,此時要全部扔掉),她可以選擇任意一棵子樹吃掉,但她只能吃一次,因此他想知道她一次能吃到的所有糖果的顏色的異或和最大是多少(如果吃到了多個顏色相同的糖果,也需要做多次異或),你能幫幫她嗎?

時間限制:C/C++ 1秒,其他語言2秒

空間限制:C/C++ 256M,其他語言512M

輸入描述:

第一行一個整數n(1≤n≤1000)。表示樹的節點數量。
第二行個整數ai(1≤ai≤1000),表示節點i的顏色。
接下來n-1行,每行兩個整數u,v,表示節點u和節點v之間有一條邊。

輸出描述:

輸出僅有一行,一個整數表示她一次能吃到的糖果的顏色的異或和最大值。

示例1

輸入例子:

4
1 2 3 4 
1 2 
2 3 
2 4

輸出例子:

0

例子說明:

四個節點顏色各不相同。吃掉任意子樹都會在吃之前把所有糖果扔掉,因此結果為0。

示例2

輸入例子:

4
1 1 2 2 
1 2
2 3 
2 4

輸出例子:

1

例子說明:

吃掉以節點3或節點4為根的子樹都只有一個節點,結果都為0,以1為根節點時顏色為1和顏色為2的節點數量都為2,因此結果也為0。吃掉以2為根的子樹時節點3和節點4顏色都為2被刪除,結果為節點2的顏色1。

解決方法

  1. 樹結構構建:將輸入的無向邊轉換為有明確父子關系的樹結構(通過 DFS 確定每個節點的子節點)。

  2. 子樹遍歷與統計

    :對每個節點為根的子樹,通過 DFS 統計:

    • 子樹中每種顏色的出現次數;
    • 子樹所有顏色的總異或和。
  3. 計算有效異或和:對每個子樹,找出出現次數最多的顏色,排除它們的異或貢獻后,得到剩余顏色的異或和,記錄最大值。

import java.util.Scanner;
import java.util.*;
import java.io.*;// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {static List<List<Integer>> children ;static int[] colors;public static void main(String[] args) throws IOException{// 1. 讀取顏色,各邊構成無向圖/鄰接表BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());colors = new int[n+1];StringTokenizer st = new StringTokenizer(br.readLine());for(int i = 1;i<=n;i++){colors[i] = Integer.parseInt(st.nextToken());}List<List<Integer>> adj = new ArrayList<>();for(int i = 0;i<=n;i++){adj.add(new ArrayList<>());}for(int i = 0;i<n-1;i++){st = new StringTokenizer(br.readLine());int u = Integer.parseInt(st.nextToken());int v = Integer.parseInt(st.nextToken());adj.get(u).add(v);adj.get(v).add(u);}// 2. 建樹children = new ArrayList<>();for(int i = 0;i<=n;i++){children.add(new ArrayList<>());}boolean[] visited = new boolean[n+1];buildTree(1,-1,adj,visited);// 3. 遍歷每個子節點,統計最大異或數int res = 0;for(int i = 1;i<=n;i++){int[] colorCount = new int[1001];int curXor = dfs(i,colorCount);// 計算要排除的顏色int maxCount = 0;for(int j = 1;j<=1000;j++){maxCount = Math.max(maxCount,colorCount[j]);}int exclueXor = 0;for(int c = 1;c<=1000;c++){if(colorCount[c]==maxCount){if(colorCount[c]%2==1){exclueXor^=c;}}}res = Math.max(res,curXor^exclueXor);}System.out.println(res);}static void buildTree(int node,int parent,List<List<Integer>> adj,boolean[] visited){visited[node] = true;for(int neighbor: adj.get(node)){if(!visited[neighbor]&&neighbor != parent){children.get(node).add(neighbor);buildTree(neighbor,node,adj,visited);}}}static int dfs(int i,int[] colorsCount){int color = colors[i];colorsCount[color]++;int curXor = color;for(int child:children.get(i)){curXor ^= dfs(child,colorsCount);}return curXor;}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94082.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94082.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【整數轉羅馬數字】

思路計算數字的位數&#xff1a; 通過 while(x) 循環計算輸入數字 num 的位數 n。提取各位數字&#xff1a; 將數字 num 的每一位分解并存儲到 nums 數組中&#xff0c;順序為從高位到低位。羅馬數字映射&#xff1a; 使用固定數組 Roman 存儲羅馬數字符號&#xff1a;Roman {…

spring Scheduled注解詳解

spirng Scheduled注解詳解 用于標記需要安排執行的方法的注解。必須指定 cron、fixedDelay 或 fixedRate 中的恰好一個屬性。 被標注的方法必須不接受任何參數。它通常會具有 void 類型的返回值&#xff1b;如果不是這樣&#xff0c;那么在通過調度器調用該方法時&#xff0c;返…

新升級超值型系列32位單片機MM32G0005

靈動微推出的新型MM32G0005系列基于ArmCortex - M0內核&#xff0c;具備高可靠性、低功耗、高性價比等特性。Flash升級至64KB&#xff0c;SRAM為4KB&#xff0c;還有1KB Data Flash。Flash全溫擦寫次數超過10萬次。采用24Pin封裝&#xff0c;最多有22個IO。QFN20和TSSOP20封裝與…

Spark SQL 的詳細介紹

Spark SQL 是 Apache Spark 生態系統中用于處理結構化數據的模塊&#xff0c;它將 SQL 查詢與 Spark 的分布式計算能力相結合&#xff0c;提供了一種高效、靈活的方式來處理結構化和半結構化數據。以下是對 Spark SQL 的詳細介紹&#xff1a;1. 核心定位與優勢結構化數據處理&a…

【FreeRTOS】空閑任務與鉤子函數原理、實現與功能詳解

一、FreeRTOS空閑任務概述FreeRTOS中的空閑任務(Idle Task)是系統自動創建的一個特殊任務&#xff0c;具有最低優先級(優先級0)。當沒有其他更高優先級的任務運行時&#xff0c;調度器就會運行空閑任務。空閑任務的主要功能系統資源回收&#xff1a;自動清理被刪除任務的內存和…

imx6ull-驅動開發篇6——Linux 設備樹語法

目錄 前言 設備樹 設備樹概念 DTS、 DTB 和 DTC DTS 語法 .dtsi 頭文件 設備節點 /根節點?? 節點命名與標簽 節點層次結構? 屬性數據類型? 標準屬性 compatible 屬性 model 屬性 status 屬性 #address-cells 和#size-cells 屬性 reg 屬性 ranges 屬性 n…

ansible簡單playbook劇本例子2

1. 準備主機組[rootansible-master ansible_quickstart]# vim inventory/hosts[web:vars] ansible_port22 ansible_passwordAdmin123456[web] 192.168.100.1822.準備劇本 vim hello.yml--- - hosts: webremote_user: roottasks:- name: Ping the target hostsping:- name: 獲取…

EmpService 和 EmpMapper接口的作用

在這個項目中&#xff0c;EmpService 和 EmpMapper 都定義接口&#xff0c;是基于面向接口編程&#xff08;Interface Oriented Programming&#xff0c;IOP&#xff09;的設計思想&#xff0c;這兩種接口在項目中承擔著不同的職責&#xff0c;具體說明如下&#xff1a; EmpSer…

【語音技術】什么是動態實體

目錄 動態實體的定義和維度 1.1 動態實體的資源 1.2 生效維度 1.2.1 應用級 1.2.2 用戶級 1.2.3 自定義級 2. 動態實體的上傳及使用 2.1 WebAPI 2.1.1 授權認證 2.1.2 上傳資源接口 2.1.2.1 參數說明 2.1.2.2 返回說明 2.1.3 查詢打包狀態 2.1.3.1 參數說明 2.1.…

STM32學習記錄--Day3

今天了解了下I2C&#xff1a;1.I2C電路結構I2C通信示意圖&#xff1a;數據傳輸階段????主→從模式??&#xff08;寫操作&#xff09;&#xff1a;主機控制SCL時鐘&#xff08;把SCL拉低&#xff09;主機向SDA線發送數據&#xff08;每次8位1位ACK&#xff09;??主←從模…

裂變數據看板:5個核心指標決定活動生死?

數據是裂變活動的“指南針”。本文詳解曝光量、轉化率、裂變系數等5大核心指標&#xff0c;結合工具與案例&#xff0c;教你用數據驅動活動優化&#xff0c;避免“自嗨式裂變”。?為什么數據是裂變的“生死線”&#xff1f;&#xff08;認知重構&#xff09; 很多企業裂變活動…

iOS 類存儲 與 C# 類存儲 的差異

C# 中類的代碼&#xff08;包括方法、屬性等成員&#xff09;的存儲機制與 Objective-C 有顯著差異&#xff0c;其核心依賴于 ?CLR&#xff08;公共語言運行時&#xff09;的方法表&#xff08;Method Table&#xff09;和虛擬方法表&#xff08;vtable&#xff09;機制&#…

Selenium自動化:輕松實現網頁操控

selenium自動化 1 什么是 Selenium 自動化 Selenium 是一個用于 Web 應用程序測試的工具&#xff0c;支持多種瀏覽器&#xff08;如 Chrome、Firefox、Edge 等&#xff09;。WebDriver 是 Selenium 的核心組件&#xff0c;用于控制瀏覽器行為并執行自動化操作。元素定位是通過…

又開發了一個優雅的小工具!

在開源項目中&#xff0c;Issues是一個強大的功能&#xff0c;用于跟蹤bug、功能請求和任務。然而&#xff0c;隨著項目的發展&#xff0c;Issues可能會變得難以管理&#xff0c;特別是當你需要離線訪問或進行深入分析時。 當然GitHub Issues除了上述功能以外&#xff0c;做在線…

【安裝教程】Docker Desktop 安裝與使用教程

文章目錄一、環境要求二、安裝步驟2.1 安裝 WSL 2&#xff08;適用于非專業版 Windows 10 及 Windows 11&#xff09;2.2 安裝 Docker Desktop2.3 漢化 DDocker Desktop2.4 卸載 Docker Desktop三、使用 Docker3.1驗證安裝3.2. 拉取鏡像3.3. 運行容器3.4. 查看容器3.5.更改容器…

Hutool 的 WordTree(敏感詞檢測)

package cn.hutool.dfa;WordTree 繼承自 HashMap<Character, WordTree>&#xff0c;表示一個字符到子樹的映射&#xff0c;構成一顆“詞樹”&#xff08;類似 Trie 樹&#xff09;&#xff0c;用于快速匹配字符串中的詞語&#xff08;敏感詞檢測、關鍵詞匹配等&#xff0…

Makefile 從入門到精通:自動化構建的藝術

引入 在軟件開發的世界里&#xff0c;“編譯” 是繞不開的環節&#xff0c;但手動編譯大型項目時&#xff0c;重復輸入編譯命令的痛苦&#xff0c;相信每個開發者都深有體會。Makefile 作為自動化構建的基石&#xff0c;能讓編譯過程“一鍵完成”&#xff0c;甚至智能判斷文件變…

利用DeepSeek將Rust程序的緩沖輸出改寫為C語言實現提高輸出效率

在前面多語言測試中&#xff0c;遇到一個難以置信的問題&#xff0c;rust的輸出到文件比c語言還快&#xff0c;這是不合情理的&#xff0c;通過對兩者輸出語句的比較&#xff0c;發現了不同。 rust程序在輸出到stdout前有這么一句 let mut writer BufWriter::with_capacity(6…

Java Optional 類教程詳解

一、Optional 類核心定位Optional 是 Java 8 引入的函數式容器類&#xff08;java.util.Optional&#xff09;&#xff0c;專為??顯式空值處理??設計。其核心價值在于&#xff1a;消除 60% 以上的傳統 null 檢查代碼通過類型系統強制空值聲明&#xff0c;降低 NPE 風險支持…

Agent X MCP 把想法編譯成現實

多模態GUI智能體協作型AI魔搭社區MCPMCP 硬件