1. 程式人生 > >演算法:輸入一個數組,對每個元素列印第一個滿足比該元素大並且在該元素後面的元素的下標,若不存在這樣的元素則列印-1。

演算法:輸入一個數組,對每個元素列印第一個滿足比該元素大並且在該元素後面的元素的下標,若不存在這樣的元素則列印-1。

INPUT
01234567
59304569
OUTPUT元素:5  9  3  0  4   5  6   9下標:1 -1  4  4  5  6  7   -1

實現方法:用棧實現

步驟1:遍歷所有元素做:若棧非空並且棧頂元素小於當前元素則彈出所有小於當前元素的棧內元素,並列印當前元素的下標,然後將當前元素入棧。

步驟2:若棧非空,彈出棧內所有元素並同時列印-1.

C++實現

#include <stack>
#include <iostream>
#include <stdlib.h>

using namespace std;



int main(int argc, char **argv)
{
    if (argc==1){
        cout<< "usage:./out <num...>" << endl;
        exit(1);   
    }
    stack<int> s;
    int index = 1;

    while (index < argc){
        int temp = atoi(argv[index]);       
        while ((s.size() > 0) && (s.top() < temp)){
            cout<< s.top() << "("<< index - 1 << ") ";
            s.pop();
        }
        s.push(temp);
        
        index++;
    }
    while (s.size() > 0){
        cout<< s.top() << "("<< -1 << ") ";
        s.pop();
    }
    cout << endl;
    return 0;
}

測試:

[[email protected] home]# ./a.out 2 8 3 4 0 5  2 4 6 3 8 10 3 4 3 29 4 6 4 2 74 3 2 5 3 21 62 29 0 2 43 4 5 
2(1) 3(3) 0(5) 4(5) 2(7) 4(8) 5(8) 3(10) 6(10) 8(11) 8(11) 3(13) 3(15) 4(15) 10(15) 4(17) 2(20) 4(20) 6(20) 29(20) 2(23) 3(23) 3(25) 5(25) 21(26) 0(29) 2(30) 29(30) 4(32) 5(-1) 43(-1) 62(-1) 74(-1) 
[
[email protected]
home]# ./a.out 5 9 3 0 4 5 6 9 5(1) 0(4) 3(4) 4(5) 5(6) 6(7) 9(-1) 9(-1)

相關推薦

演算法輸入個數每個元素列印第一滿足元素並且元素後面元素存在這樣元素列印-1

INPUT0123456759304569OUTPUT元素:5  9  3  0  4   5  6   9下標:1 -1  4  4  5  6  7   -1實現方法:用棧實現步驟1:遍歷所有元素做:若棧非空並且棧頂元素小於當前元素則彈出所有小於當前元素的棧內元素,並列印

前端演算法給定個數寫一個函式將所有0的移動到它的末尾同時保持非零元素的相對順序(移動零)

給定一個數組nums,寫一個函式將所有0的移動到它的末尾,同時保持非零元素的相對順序。 例: 輸入: [0,1,0,3,12] 輸出: [1,3,12,0,0] 注意: 您必須在不製作陣列副本的情況下就地執行此操作。 最小化操作總數。 <script>

演算法】給定個數除了個數出現1次之外其餘數都出現3次輸出出現次的那個數

給定一個數組,除了一個數出現1次之外,其餘數都出現3次。找出出現一次的數。如:{1, 2, 1, 2, 1, 2, 7},找出7.格式:第一行輸入一個數n,代表陣列的長度,接下來一行輸入陣列A[n],(輸入的陣列必須滿足問題描述的要求),最後輸出只出現一次的數。

在陣列中的兩數字如果前面一個數字大於後面的數字這兩數字組成一個逆序輸入個數,求出這個陣列中的逆序的總數P並將P1000000007取模的結果輸出

 /*        最簡單的思路:陣列的所有數兩兩比較,進行累加,空間複雜度為O(n^2)  */ class Solution { public: int InversePairs(vector<int> data) { int P

有自己的程式碼--題目給定一個數組,裡面全是正整數。數字大小表示這步最多可以向後移動幾節點。總是從陣列第一個元素開始移動。問如何移動可以以最少步數移動到最後一個節點。

原文:https://yq.aliyun.com/articles/547799 描述: 題目:給定一個數組,裡面全是正整數。數字大小表示這一步最多可以向後移動幾個節點。總是從陣列第一個元素開始移動。問如何移動,可以以最少步數移動到最後一個節點。 例如:[3,4,2

python筆試題-平衡點問題 假如個數中的元素其前面的部分等於後面的部分那麼這個點的位序就是平衡點

平衡點問題 假如一個數組中的元素,其前面的部分等於後面的部分,那麼這個點的位序就是平衡點。 比如一個列表numbers = [1, 3, 5, 7, 8, 25, 4, 20]。25前面的總和為24,25,後面的總和也是24,那麼這個點就是平衡點。 要求編

在陣列中的兩數字如果前面一個數字大於後面的數字這兩數字組成一個逆序輸入個數,求出這個陣列中的逆序的總數P並將P1000000007取模的結果輸出 即輸出P%100000000

分析:可以利用兩層for迴圈,從頭開始遍歷查詢每一個元素的逆序對數,然後求總和。也可以利用歸併排序的思想來求解。下面是利用歸併排序的思想求解 public class Solution{public int InversePairs(int[] array) {if (ar

面試題給定個數陣列中只包含0和1請找到一個最長的子序列其中0和1的數量是相同的

這個題目,看起來比較簡單,一些同學可能認為題目的描述符合動態規劃的特徵,然後就開始用動態規劃解,努力找狀態轉移方程。這些同學的感覺,是很正確的。但,找狀態轉移方程,我們要對原來的陣列進行變換一下。 原來是0和1的串,我們將0都換為-1。這樣題目目標就變成,找到一個最長的子串,子串數字和是0。設原陣列為A

題目三給定個數值可以為正、負和0請返回累加和為給定值k的最長子陣列長度

import java.util.HashMap; /** * * 2、給定一個數組,值可以為正、負和0,請返回累加和為給定值k的最長子陣列長度。 * 咱們可以反推,比如:1- 100,陣列和為1000. * 要求最長和為300的子陣列,我可以反著求第一

題目四給定個數值可以為正、負和0請返回累加和小於等於k的最長子陣列長度 時間複雜度O(n)

import java.util.HashMap; /** * * 3、給定一個數組,值可以為正、負和0,請返回累加和小於等於k的最長子陣列長度。 時間複雜度:O(n) * * 這裡需要分為兩步,第一步是獲取,以每個位置開頭最小和的長度。第二步,從0到N逐

C++面向象的學習個數

html ++ iuc collect com 4tb ndt gin 面向對象 凰00盟3NDT73澄F概http://www.zcool.com.cn/collection/ZMTgxNzIzMjg=.html O00W51槐AQ毓攀7柿http://www.zcool

輸入個數長度動態建立陣列所有元素隨機生成輸出元素中的最

int length = 0;         printf("輸入一個數組長度:");         scanf("%d", &length);         int *p = malloc(sizeof(int) * length);         for

輸入個數和一個數字在陣列中查詢兩個數使得它們的和正好是輸入的那個數字 時間複雜度O(NlogN)

/* *[email protected] 轉載請註明出處 *題目:輸入一個數組和一個數字,在陣列中查詢兩個數, *使得它們的和正好是輸入的那個數字。 *如果有多對數字的和等於輸入的數字,輸出任意一對即可。 *例如輸入陣列1、2、4、7、11、15和數字15。由於

演算法(輸出個數中的重複數(並非全部重複數))

陣列長度為n+1,元素範圍1-n,輸出一個重複的數。 public class TheSameNumber1 { private int theSameNumber(int[] a) {

演算法設計個數組分為奇數、偶數左右兩部分要求時間複雜度為O(n)

        已知陣列A[n]中的元素為整型,設計演算法將其調整為左右兩部分,左邊所有元素為奇數,右邊所有元素為偶數,並要求演算法的時間複雜度為O(n)。 程式碼實現部分: #include &l

扁平化個數

解構 urn else 中括號 math clas 結構數組 OS 如何 一、扁平化一個數組   前幾天遇到的一個問題了,有一個數組var str=[1,2,1,[4,5,[6,7,[8,9]]]];如何講這個數組扁平化,去掉這些重復的中括號。我I也是想了很久才寫了出來,在

C++個數的前m元素和後n-m元素整體互換位置

笨方法 >_<  #include <iostream> using namespace std; int main() { int n,m,i,j; int a[100]; cout<<"請輸入要建立陣列的長度(不能超過100)

程式設計個數元素的最

方法1:自己 #include<stdio.h> void main(void){ int s[10] = {10, 23, 45, 1, 34, 76,100, 32, 456,54}; int i,j; int max; //求陣列s元素的最大

演算法】刪除個數中為0的元素

題目描述: 給定一個一維陣列,將其中為0的元素刪除掉,非零元素的相對位置保持不變,最終目標陣列保留在原陣列中,並且目標陣列長度之外的元素全部置為0。 解題思路: (1)陣列非零元素往前移動,時

C++面向物件的學習個數

寫一個數組類,實現相關函式,自定義建構函式能設定陣列大小,獲取陣列長度,獲取陣列的元素, 完成陣列的拷貝建構函式,允許兩個陣列物件互相賦值 #ifndef __MYARRAY_H__ #define __MYARRAY_H__ class Array { public: