1. 程式人生 > >騰訊面試題:根據上排給出的十個數,在其下排填出對應的十個數。

騰訊面試題:根據上排給出的十個數,在其下排填出對應的十個數。

問題描述:根據上排給出的十個數,在其下排填出對應的十個數,要求下排每個數都是先前上排那十個數在下排出現的次數。

上排的十個數如下:
0,1,2,3,4,5,6,7,8,9

答案是:

6,2,1,0,0,0,1,0,0,0

我在這裡使用DFS,並且使用兩個函式互相遞迴。

程式碼如下:

#include <iostream>  
#define MAX 10  
using namespace std;  
  
int a[MAX],su;  
  
void output()  
{  
    for (int i=0;i<MAX;i++)  
        cout<<a[i]<<' ';  
    cout<<endl;  
}  
  
void alloc(int,int,int);  
void go(int n)//嘗試第n位  
{  
    if (n==MAX)  
    {  
        output();  
        return;  
    }  
    int have=0;  
    for (int i=0;i<MAX;i++)  
        if (a[i]==n) have++;  
    int empty=0;  
    for (int i=n;i<MAX;i++)  
        if (a[i]==-1) empty++;  
    int pos;  
    for (pos=n+1;pos<MAX;pos++)  
        if (a[pos]==-1) break;  
    if (a[n]!=-1)  
    {  
        if (empty<a[n]-have||a[n]<have)  
            return;  
        alloc(n,a[n]-have,pos);  
    }  
    else  
    {  
        for (a[n]=n>have?n:have;a[n]<=have+empty;a[n]++)  
        {  
            if (a[n]!=n)  
                alloc(n,a[n]-have,pos);  
            else if (a[n]-1-have>=0)  
                alloc(n,a[n]-1-have,pos);  
        }  
        a[n]=-1;  
    }  
}  
  
void alloc(int n,int quantity,int pos)//在pos位之後分配quantity個n  
{  
    if (quantity==0)  
    {  
        go(n+1);  
        return;  
    }  
    int empty=0;  
    for (int i=pos+1;i<MAX;i++)  
        if (a[i]==-1) empty++;  
    int p;  
    for (p=pos+1;p<MAX;p++)  
        if (a[p]==-1) break;  
    if (pos>=MAX) return;  
    a[pos]=n;  
    alloc(n,quantity-1,p);  
    a[pos]=-1;  
    if (empty>=quantity)  
        alloc(n,quantity,p);  
}  
  
int main()  
{  
    for (int i=0;i<MAX;i++) a[i]=-1;  
    go(0);  
    return 0;  
}  

相關推薦

試題根據上排個數下排對應個數

問題描述:根據上排給出的十個數,在其下排填出對應的十個數,要求下排每個數都是先前上排那十個數在下排出現的次數。 上排的十個數如下: 0,1,2,3,4,5,6,7,8,9 答案是: 6,2,1,0,0,0,1,0,0,0 我在這裡使用DFS,並且使用兩個函式互相遞迴。 程

試題快速找到未知長度單鏈表的中間結點

題目:快速找到未知長度單鏈表的中間結點首先分析一下,既然是一個面試題,就一定有普通方法和高階方法,而高階方法無疑會為你大大加分!普通方法很簡單:首先遍歷一遍單鏈表以確定單鏈表的長度L。然後再此從頭結點出發迴圈L/2次找到單鏈表的中間結點。普通方法的演算法複雜度為:O(L+L/

試題模板實現一個棧要求Push(入棧)Pop(棧)Max(返回最大值的操作)的時間複雜度為O(1)

解題思路:要用模板實現亂序入棧的陣列每次pop()出棧都能得到當前棧中Max的最大值,就必須在push()入棧時進行維護操作,使的每次入棧的元素都能夠找到合適的位置並push(),每次push()操作完成後棧中的元素都能夠按從棧頂到棧底從大到小排列即可。這就需要寫一個不同於常

試題整理18 根據上排個數下排對應個數

 題目: 給你10分鐘時間,根據上排給出十個數,在其下排填出對應的十個數   要求下排每個數都是先前上排那十個數在下排出現的次數。   上排的十個數如下:   【0,1,2,3,4,5,6,7,8,9】 舉一個例子,   數值: 0,1,2,3,4,5,6,7,8,9 

[js高手之路]javascript試題學習封裝一個簡易的異步隊列

騰訊 selector host .proto 算法 obj 代碼 ner 試題 這道js的面試題,是這樣的,頁面上有一個按鈕,一個ul,點擊按鈕的時候,每隔1秒鐘向ul的後面追加一個li, 一共追加10個,li的內容從0開始技術( 0, 1, 2, ....9 ),首先我

阿裏、網易和試題 C/C++

不同的 三次握手 進程組 HR 是什麽 ret 區分 point 兩個 一、線程、鎖 1、Posix Thread互斥鎖 線程鎖創建 a.靜態創建 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; b.動態創建 pt

試題總結 似乎是面試C 方向的 小巫總結

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

試題——螞蟻爬行(C++版)

#include <iostream> #include <limits> #include "ctime" using namespace std; const double DBL_MAX = numeric_limits<double&

試題 快慢指標演算法快速找到單鏈表中間值

快速找到未知長度的單鏈表的中間節點 普通方法就是遍歷兩次,第一次遍歷得到連結串列長度,第二次遍歷得到中間值。時間複雜度為1.5n。(這裡需要強調1.5) 快速連結串列方法就是利用兩個指標,慢指標每次移動一個數據,快指標每次移動兩個資料。最外層的迴圈用快指標。當快

2.判斷一個二叉樹是否是二叉搜尋樹(試題

1.面試的時候當面試官提出來的時候,我立馬想到的就是基於前序遍歷的遞迴方法。但是這個方法在面試官給說一個測試用例的時候就徹底傻眼了。public class Main { public static boolean isSerchBTree(TreeNode root)

試題猜字遊戲---猜1-100之間一個數字最少多少次?第一次猜的數是幾?

題目: A、B兩人玩猜字遊戲,遊戲規則如下: A選定一個 [1,100]之間的數字背對B寫在紙上,然後讓B開始猜; 如果B猜的偏小,A會提示B這次猜的偏小; 一旦B某次猜的偏大,A就不再提示,此次之後B猜的偏小A也不會再提示,只回答猜對與否。 請問:B至少要猜()次才能保證

試題-----JavaScript中arguments物件解析

在騰訊面試中遇到了這樣問題: js程式碼 function test(x,y){ var x = 10; alert(arguments[0],arguments[1]); } test(); 獲取arguments資料 Array.p

一道試題(使用遞迴、迴圈、陣列實現上臺階方法)

//一道騰訊面試題 //題目:有50個臺階,一次走一步或者兩步,有多少種可能? 分析: 如果有一個臺階,則只有一種可能:1; 如果有兩個臺階,只有兩種可能:11或2; 如果有三個臺階,則有三種

遞推 你10分鐘時間根據上排個數下排對應個數 要求下排個數都是先前上排個數下排出現的次數

騰訊面試題:給你10分鐘時間,根據上排給出十個數,在其下排填出對應的十個數   要求下排每個數都是先前上排那十個數在下排出現的次數。   上排的十個數如下:   【0,1,2,3,4,5,6,7,8,

【原理思路】大資料中找中位數(試題

題目: 在一個大檔案中有100億個32位整數,亂序排列,要求找出中位數;記憶體限制為512M;請寫出演算法設計思路; 基本分析: (1)中位數的定義:一個給定排序好的序列,奇數個的話,我們就取中間的一個;偶數個的話,我們一般取中間兩個數的平均值;因此對於本題,我們需得到中

試題04.程序和執行緒的區別?

程序和執行緒的區別? 程序和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就

試題根據輸入的一個整數輸出蛇形矩陣

蛇形矩陣示例: 整數3對應的蛇形矩陣為: 1 2 3 8 9 4 7 6 5 整數4對應的蛇形矩陣為: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 生成蛇形矩陣A的關鍵是,建立與其對應的導航矩陣B。所謂導航矩陣,就是B[i][j]所儲存的

阿里、網易和試題 C/C++

一、執行緒、鎖 1、Posix Thread互斥鎖 執行緒鎖建立 a.靜態建立 pthread_mutex_tmute

java基礎試題try{}裏有一個return語句那麽緊跟在這個try後的finally {}裏的code會不會被執行什麽時候被執行在return前還是後?

nal java pan clas out bsp 出現 可能 inf package com.swift; public class Try_Catch_Finally_Test { public static void main(String[] args

6.你10 分鐘時間根據上排個數下排對應個數

要求下排每個數都是先前上排那十個數在下排出現的次數。上排的十個數如下: 【0,1,2,3,4,5,6,7,8,9】 舉一個例子, 數值: 0,1,2,3,4,5,6,7,8,9 分配: 6,2,1,0,0,0,1,0,0,0 0 在下排出現了6 次,1 在下排出現了2 次,