拼多多筆試 拼多多筆試題 0323
筆試時間:2025年03月23日
歷史筆試傳送門:
第一題
題目:多多的推箱子游戲
多多最近在玩一個推箱子游戲,在一個二維坐標(biāo)中,箱子的起坐標(biāo)是 (x,y) ,多多有四個方向鍵可以操作:***W***:將箱子向上移動,即:(x,y) -> (x, y+1)***A***:將箱子向左移動,即:(x,y) -> (x-1, y)***S***:將箱子向下移動,即:(x,y) -> (x, y-1)***D***:將箱子向右移動,即:(x,y) -> (x+1, y)在經(jīng)過多多一系列按鍵操作后,如果恰好最終箱子的位置恰好在 (0,0) 就算贏了,請你幫忙計算多多是否能贏。
輸入描述
第一行,包含一個數(shù)字T(1 <= T <= 100),表示T組測試用例。
接下來,對于每組測試用例,輸入有2行:第1行包含兩個數(shù)字x和y,表示箱子的起始坐標(biāo)(x,y)。 -10000 <= x,y <= 10000
第2行包含一個字符串S(由W、A、S、D這4個字母組成),記錄了多多的一系列移動操作。字符串的長度大于0且不超過1000
輸出描述
對于每組測試用例,輸出一個字符串:"YES" 表示贏了, "NO" 表示沒有贏。
樣例輸入
2
2 0
WAS
1 0
WAADS
樣例輸出
NO
YES
說明:
有2組測試用例:對于第1組用例,起始位置是(2,0),經(jīng)過W、A、S操作后,位置的變化過程是:-> (2,1) -> (1,1) -> (1, 0),最終位置是(1, 0),所以沒有贏,輸出NO。對于第2組測試用例,初始位置是(1,0),經(jīng)過W、A、A、D、S操作后,位置的變化過程是:-> (1,1)-> (0,1)-> (-1,1) -> (0,1) -> (0,0),最終位置是(0,0),所以贏了,輸出YES。
參考題解
模擬。輸入處理:首先讀取輸入的測試用例數(shù)量 T。對于每個測試用例,讀取起始坐標(biāo) (x, y) 和操作字符串 S。坐標(biāo)更新:根據(jù)操作字符串中的每個字符更新箱子的位置。使用字典來映射每個操作對應(yīng)的坐標(biāo)變化。結(jié)果判斷:遍歷完所有操作后,檢查最終的坐標(biāo)是否為 (0,0),如果是則輸出 "YES",否則輸出 "NO"。
C++:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
#include <iostream> #include <map> #include <string> using namespace std; int main() { int t; cin >> t; map<char, pair<int, int>> directions; directions['W'] = {0, 1}; directions['A'] = {-1, 0}; directions['S'] = {0, -1}; directions['D'] = {1, 0}; while (t--) { int x, y; cin >> x >> y; string s; cin >> s; for (char c : s) { x += directions[c].first; y += directions[c].second; } if (x == 0 && y == 0) { cout << "YES" << endl; } else { cout << "NO" << endl; } } return 0; }
Java:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); Map<Character, int[]> directions = new HashMap<>(); directions.put('W', new int[]{0, 1}); directions.put('A', new int[]{-1, 0}); directions.put('S', new int[]{0, -1}); directions.put('D', new int[]{1, 0}); while (t-- > 0) { int x = sc.nextInt(); int y = sc.nextInt(); String s = sc.next(); for (char c : s.toCharArray()) { x += directions.get(c)[0]; y += directions.get(c)[1]; } if (x == 0 && y == 0) { System.out.println("YES"); } else { System.out.println("NO"); } } } }
Python:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
t = int(input()) directions = { 'W': (0, 1), 'A': (-1, 0), 'S': (0, -1), 'D': (1, 0) } for _ in range(t): x, y = map(int, input().split()) s = input().strip() for c in s: dx, dy = directions[c] x += dx y += dy if x == 0 and y == 0: print("YES") else: print("NO")
第二題
題目:多多買彩票
多多的家鄉(xiāng)最近推出了一種新型彩票,規(guī)則非常有趣:如果一個數(shù)字中,隱藏著一個連續(xù)的子串,且這個子串代表的數(shù)是3的倍數(shù),那么這個數(shù)字就是“幸運(yùn)數(shù)字”。彩票每期都會公布一個范圍[L, R],并從這個范圍的“幸運(yùn)數(shù)字”中隨機(jī)選擇一個作為中獎號碼。以下是一些例子,輔助理解“幸運(yùn)數(shù)字”的含義:107是“幸運(yùn)數(shù)字”:0是107的子串,且0是3的倍數(shù)25不是“幸運(yùn)數(shù)字”:25有3個子串分別是2、5、25,它們都不是3的倍數(shù)2521是“幸運(yùn)數(shù)字”:21是2521的子串,且21是3的倍數(shù)注意子串必須是連續(xù)的,例:在數(shù)字152中,15是子串,12不是子串
以0開頭的子串需要抹去先導(dǎo)0來考慮數(shù)值,例:在數(shù)字103中,03是一個子串,它的值為3,也是3的倍數(shù)多多想知道[L, R]中有多少個幸運(yùn)數(shù)字,你能幫幫他嗎?
輸入描述
有多個測試用例。輸入的第一行包含一個整數(shù)T(1<=T<=10000),表示測試用例的數(shù)量;
每組輸入僅一行,包含兩個整數(shù)L,R(1<=L<=R<=1e18)
輸出描述
對每個測試用例,輸出一個整數(shù),表示區(qū)間[L,R]中“幸運(yùn)數(shù)字”的個數(shù)。
樣例輸入
2
8 19
2 45
樣例輸出
8
31
參考題解
題目要求找出區(qū)間[L, R]中所有幸運(yùn)數(shù)字的個數(shù)。幸運(yùn)數(shù)字的定義是存在一個連續(xù)子串表示的數(shù)是3的倍數(shù)。直接計算幸運(yùn)數(shù)字比較復(fù)雜,可以考慮計算非幸運(yùn)數(shù)字的數(shù)量,然后用總數(shù)減去非幸運(yùn)數(shù)字的數(shù)量得到幸運(yùn)數(shù)字的數(shù)量。非幸運(yùn)數(shù)字是指其所有連續(xù)子串都不滿足是3的倍數(shù)。根據(jù)數(shù)論知識,一個數(shù)是3的倍數(shù)當(dāng)且僅當(dāng)其各位數(shù)字之和是3的倍數(shù)。對于一個數(shù)來說,如果其所有長度為1、2、3的子串都不滿足各位數(shù)字之和是3的倍數(shù),那么該數(shù)就是非幸運(yùn)數(shù)字。因為對于長度大于3的數(shù),根據(jù)鴿巢原理,必然存在一個長度為3的子串各位數(shù)字之和是3的倍數(shù)。預(yù)處理所有小于1000的數(shù),判斷哪些是非幸運(yùn)數(shù)字,并記錄它們的前綴和。因為對于大于等于1000的數(shù),必然存在一個長度為3的子串各位數(shù)字之和是3的倍數(shù),所以這些數(shù)都不是非幸運(yùn)數(shù)字。對于給定的區(qū)間[L, R],計算該區(qū)間內(nèi)非幸運(yùn)數(shù)字的數(shù)量,然后用總數(shù)(R-L+1)減去非幸運(yùn)數(shù)字的數(shù)量得到幸運(yùn)數(shù)字的數(shù)量。利用預(yù)處理的前綴和數(shù)組,可以快速計算任意區(qū)間內(nèi)的非幸運(yùn)數(shù)字?jǐn)?shù)量,總數(shù)減去非幸運(yùn)數(shù)字?jǐn)?shù)量即為幸運(yùn)數(shù)字?jǐn)?shù)量。
C++:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
#include <iostream> #include <vector> #include <set> using namespace std; vector<int> get_digits(int x) { if (x == 0) { return {0}; } vector<int> digits; while (x > 0) { digits.push_back(x % 10); x /= 10; } reverse(digits.begin(), digits.end()); return digits; } bool is_unlucky(int x) { if (x == 0) { return false; } vector<int> digits = get_digits(x); set<int> seen; int total = 0; for (int d : digits) { total += d; int mod = total % 3; if (mod == 0) { return false; } if (seen.find(mod) != seen.end()) { return false; } seen.insert(mod); } return true; } int main() { int T; cin >> T; const int max_small = 1000; vector<bool> is_unlucky_list(max_small, false); int unlucky_count = 0; for (int i = 0; i < max_small; i++) { if (is_unlucky(i)) { is_unlucky_list[i] = true; unlucky_count++; } } vector<int> prefix_unlucky(max_small, 0); prefix_unlucky[0] = is_unlucky_list[0] ? 1 : 0; for (int i = 1; i < max_small; i++) { prefix_unlucky[i] = prefix_unlucky[i - 1] + (is_unlucky_list[i] ? 1 : 0); } while (T--) { int L, R; cin >> L >> R; auto compute = [&prefix_unlucky, &unlucky_count](int x) { if (x >= 999) { return x + 1 - unlucky_count; } else { if (x < 0) { return 0; } return (x + 1) - prefix_unlucky[x]; } }; int fR = compute(R); int fL_1 = compute(L - 1); cout << fR - fL_1 << endl; } return 0; }
Java:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
import java.util.*; public class Main { public static List<Integer> getDigits(int x) { if (x == 0) { return Arrays.asList(0); } List<Integer> digits = new ArrayList<>(); while (x > 0) { digits.add(x % 10); x /= 10; } Collections.reverse(dig
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
2025打怪升級記錄,大廠筆試合集 C++, Java, Python等多種語言做法集合指南