拼多多2020校招部分算法程式設計題2道,多多的魔術盒子和多多的排列函數
其實根據他的比對職位我們可以看到,這5道題的難度還是并不高,隻是作為一個初步篩選,我這邊選擇了前兩道跟大家分享

[程式設計題一] 多多的魔術盒子:
多多雞有N個魔術盒子(編号1~N),其中編号為i的盒子裡有i個球。多多雞讓皮皮蝦每次選擇一個數字X(1 <= X <= N),多多雞就會把球數量大于等于X個的盒子裡的球減少X個。通過觀察,皮皮蝦已經掌握了其中的奧秘,并且發現隻要通過一定的操作順序,可以用最少的次數将所有盒子裡的球變沒。
那麼請問聰明的你,是否已經知道了應該如何操作呢?
輸入描述:
第一行,有1個整數T,表示測試用例的組數。(1 <= T <= 100)接下來T行,每行1個整數N,表示有N個魔術盒子。(1 <= N <= 1,000,000,000)
輸出描述:
共T行,每行1個整數,表示要将所有盒子的球變沒,最少需要進行多少次操作。
輸入例子1:
3125
輸出例子1:
123
詳細題解:
#牛人的Python代碼:思路就是将 數字轉二進制,位數就是結果,真的是牛人,太秀了n = int(input())for i in range(n): x = int(input()) print(len(bin(x))-2)#正常解法一(JAVA):求最少的次數把所有盒子減到0,那麼第一次減少的球為中間盒子數量即可,分治求解 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); for (int i = 0; i < num; i++) { int value = scanner.nextInt(); System.out.println(work(value)); } } private static int work(int i) { int time = 1; while (i != 1){ i = i/2; time++; } return time; }#正常解法二(C/C++):也可找通過找規律求解。#比如2、3個盒子需要2次,4、5、6、7個盒子需要3次,則n個盒子需要(logn)下取整+1次#include#include#define N 100int main(){ int time; int a[N]; int d[N]; scanf("%d",&time); for(int i=0;i
[程式設計題二] 多多的排列函數:
數列 {An} 為N的一種排列。
例如N=3,可能的排列共6種:
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
定義函數F:
其中|X|表示X的絕對值。
現在多多雞想知道,在所有可能的數列 {An} 中,F(N)的最小值和最大值分别是多少。
輸入描述:
第一行輸入1個整數T,表示測試用例的組數。( 1 <= T <= 10 )第二行開始,共T行,每行包含1個整數N,表示數列 {An} 的元素個數。( 1 <= N <= 100,000 )
輸出描述:
共T行,每行2個整數,分别表示F(N)最小值和最大值
輸入例子1:
223
輸出例子1:
1 10 2
例子說明1:
對于N=3:- 當{An}為3,2,1時可以得到F(N)的最小值0- 當{An}為2,1,3時可以得到F(N)的最大值2
題目詳解:
題目沒什麼難度,主要就是要了解題目。隻要明白在{An}的所有排列中,能夠讓F(N)取得的最大最小值為多少。
比如每四個數 5,6,7,8,我們把它們兩兩一組 |||8-6|-7|-5|=0,最小值是0;猜測最小值的變化也是4個一組
看到min隻有2種取值。0,1,最大值自然就是N-getmin(N-1)
#JAVA題解import java.util.Scanner;public class Main{ public static void main(String[] args){ Scanner s=new Scanner(System.in); int count=s.nextInt(); for(int i=0;iusing namespace std;pair p[110000];int main(){ int t; cin >> t; for (int i = 1, f = 0; i <= 100000; i++, f = (f + 1) % 4) { if (f == 0 || f == 1) p[i].first = 1; else p[i].first = 0; if (f == 0 || f == 3) p[i].second = i; else if (f == 1|| f == 2 ) p[i].second = i - 1; } while (t--) { int n; cin>>n; cout<
總結
大廠的面試注重算法思想,有的時候你雖然不能夠在規定的時間内将其編碼完成,但是隻要思路能夠跟面試官講清楚,也是有很大機會過的。
學習注重積累,若有不詳盡之處,盡可探讨。