天天看點

system verilog程式設計題_拼多多2020校招部分算法程式設計題合集拼多多2020校招部分算法程式設計題2道,多多的魔術盒子和多多的排列函數[程式設計題一] 多多的魔術盒子:輸入描述:輸出描述:輸入例子1:輸出例子1:​詳細題解:[程式設計題二] 多多的排列函數:輸入描述:輸出描述:輸入例子1:輸出例子1:例子說明1:題目詳解:總結

拼多多2020校招部分算法程式設計題2道,多多的魔術盒子和多多的排列函數

其實根據他的比對職位我們可以看到,這5道題的難度還是并不高,隻是作為一個初步篩選,我這邊選擇了前兩道跟大家分享

system verilog程式設計題_拼多多2020校招部分算法程式設計題合集拼多多2020校招部分算法程式設計題2道,多多的魔術盒子和多多的排列函數[程式設計題一] 多多的魔術盒子:輸入描述:輸出描述:輸入例子1:輸出例子1:​詳細題解:[程式設計題二] 多多的排列函數:輸入描述:輸出描述:輸入例子1:輸出例子1:例子說明1:題目詳解:總結

[程式設計題一] 多多的魔術盒子:

多多雞有N個魔術盒子(編号1~N),其中編号為i的盒子裡有i個球。多多雞讓皮皮蝦每次選擇一個數字X(1 <= X <= N),多多雞就會把球數量大于等于X個的盒子裡的球減少X個。通過觀察,皮皮蝦已經掌握了其中的奧秘,并且發現隻要通過一定的操作順序,可以用最少的次數将所有盒子裡的球變沒。

那麼請問聰明的你,是否已經知道了應該如何操作呢?

system verilog程式設計題_拼多多2020校招部分算法程式設計題合集拼多多2020校招部分算法程式設計題2道,多多的魔術盒子和多多的排列函數[程式設計題一] 多多的魔術盒子:輸入描述:輸出描述:輸入例子1:輸出例子1:​詳細題解:[程式設計題二] 多多的排列函數:輸入描述:輸出描述:輸入例子1:輸出例子1:例子說明1:題目詳解:總結

輸入描述:

第一行,有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
           

[程式設計題二] 多多的排列函數:

system verilog程式設計題_拼多多2020校招部分算法程式設計題合集拼多多2020校招部分算法程式設計題2道,多多的魔術盒子和多多的排列函數[程式設計題一] 多多的魔術盒子:輸入描述:輸出描述:輸入例子1:輸出例子1:​詳細題解:[程式設計題二] 多多的排列函數:輸入描述:輸出描述:輸入例子1:輸出例子1:例子說明1:題目詳解:總結

數列 {An} 為N的一種排列。

例如N=3,可能的排列共6種:

1, 2, 3

1, 3, 2

2, 1, 3

2, 3, 1

3, 1, 2

3, 2, 1

定義函數F:

system verilog程式設計題_拼多多2020校招部分算法程式設計題合集拼多多2020校招部分算法程式設計題2道,多多的魔術盒子和多多的排列函數[程式設計題一] 多多的魔術盒子:輸入描述:輸出描述:輸入例子1:輸出例子1:​詳細題解:[程式設計題二] 多多的排列函數:輸入描述:輸出描述:輸入例子1:輸出例子1:例子說明1:題目詳解:總結

其中|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<
           

總結

大廠的面試注重算法思想,有的時候你雖然不能夠在規定的時間内将其編碼完成,但是隻要思路能夠跟面試官講清楚,也是有很大機會過的。

學習注重積累,若有不詳盡之處,盡可探讨。