Technologieaustausch

C schriftliche Testfragen

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Lösung zur Verwaltung variabler Partitionen

  • Beste Anpassung: Die freie Fläche erhöht sich mit der Kapazität
  • Schlechteste Anpassung: Die freie Fläche nimmt mit der Kapazität ab
  • Zuerst anpassen: Der freie Bereich wird um die Adresse erhöht

Es gibt Konstruktoren in C++-Strukturen.

Erstellen Sie einen neuen Benutzer oder eine neue Gruppe unter Linux

  • useradd: Mit dem Befehl wird ein Benutzerkonto erstellt
  • usermod: Benutzerkonto ändern
  • groupadd: Erstellen Sie eine neue Arbeitsgruppe
  • userdel: Benutzerkonto löschen

#include kann in der Mitte einer Programmdatei stehen.

Formale Parameternamen können in Funktionsdeklarationen weggelassen werden, nicht jedoch in Definitionen.

linearer Tisch

Eine nicht leere Datenstruktur, wenn sie die folgenden zwei Bedingungen erfüllt:

  1. Es gibt nur einen Wurzelknoten
  2. Jeder Knoten hat höchstens einen Vorgängerknoten und höchstens einen Folgeknoten.

Es wird als lineare Struktur bezeichnet und in Datenstrukturen als lineare Tabelle bezeichnet.
Der doppelt verknüpfte Listenknoten verfügt über zwei Zeigerfelder und ist eine lineare Struktur.
Die Zeiger aller Knoten in der zirkulär verknüpften Liste sind ungleich Null und ebenfalls lineare Strukturen.

Hash-Tabelle finden

Zu den Methoden zum Erstellen einer Hash-Tabelle gehören: direkte Adressmethode, Divisions- und Restmethode.

Zu den Konfliktlösungsmethoden gehören:

  • Kettenadressmethode: Elemente mit demselben Hashwert mithilfe einer verknüpften Liste verbinden.
  • Lineare Erkennung und dann Hashing-Methode: Nach dem Konflikt wird eine Schleife nach unten durchgeführt, um leere Stellen für die Platzierung zu finden.

Bitweises UND von Zahlenbereichen

Wenn links und rechts zwei ganze Zahlen vorhanden sind, die das Intervall [links, rechts] darstellen, wird das Ergebnis der bitweisen UND-Verknüpfung aller Zahlen in diesem Intervall zurückgegeben.

Für eine Reihe von Bits ist das Ergebnis der bitweisen UND-Verknüpfung dieser Reihe Null, solange es ein Bit mit dem Wert Null gibt.

Fügen Sie hier eine Bildbeschreibung ein
Im obigen Beispiel können wir das findenDas Ergebnis einer bitweisen UND-Operation für alle Zahlen ist das gemeinsame Präfix aller entsprechenden Binärzeichenfolgen, wobei die verbleibenden Bits mit Nullen aufgefüllt werden.

Zahlen, die nur einmal vorkommen (2)

Bei einem ganzzahligen Array „nums“ kommt jedes Element dreimal vor, mit Ausnahme eines Elements, das nur einmal vorkommt. Suchen Sie das Element, das nur einmal vorkommt, und geben Sie es zurück.

Entwerfen Sie einen Algorithmus mit linearer Zeitkomplexität und verwenden Sie konstanten Raum, um das Problem zu lösen.

Bestimmen Sie nacheinander jedes Binärbit
Da die Elemente im Array im Bereich von int liegen, können Sie nacheinander berechnen, ob jedes Binärbit der Antwort 0 oder 1 ist.

Betrachten Sie insbesondere die i-te Binärziffer der Antwort (i wird beginnend mit 0 nummeriert), die 0 oder 1 sein kann.

Die i-te Ziffer der Antwort ist der Rest der Summe der i-ten Binärziffern aller Elemente im Array dividiert durch 3.

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for(int i=0; i<32; i++){
            int sum = 0;
            for(int num : nums){
                sum += ((num >> i) & 1);
            }
            ret += ((sum%3) << i);
        }
        return ret;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Pow(x, n)

Schnelle Leistung + Rekursion
Die Essenz des Fast-Power-Algorithmus ist der Divide-and-Conquer-Algorithmus.
Beginnen Sie mit x und quadrieren Sie jedes Mal direkt das vorherige Ergebnis. Berechnen Sie 5 Mal, um x64 zu erhalten.

class Solution {
public:
    double quickMul(double x, long long N){
        if(N == 0){
            return 1.0;
        }
        double y = quickMul(x, N/2);
        return N%2 == 0 ? y * y : y * y * x;
    }
    double myPow(double x, int n) {
        long long N = n;
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N); 
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Null nach der Fakultät

Geben Sie bei einer gegebenen Ganzzahl n zurück: n! Die Anzahl der nachgestellten Nullen im Ergebnis.

Die Anzahl der Endnullen in n! besteht darin, die Anzahl der Faktoren 10 zu ermitteln, und 10 = 2x5, sodass sie in die Ermittlung des kleineren Werts der Anzahl der Primfaktoren 2 und der Anzahl der Primfaktoren 5 in n! umgewandelt wird.

Da die Anzahl der Primfaktoren 5 nicht größer sein wird als die Anzahl der Primfaktoren 2, wird nur die Anzahl der Primfaktoren 5 berücksichtigt.

Die Anzahl der Primfaktoren 5 in n! ist gleich der Summe der Anzahl der Primfaktoren 5 jeder Zahl.

class Solution {
public:
    int trailingZeroes(int n) {
        int res = 0;
        for(int i=5; i<=n; i += 5){
            for(int j=i; j%5 == 0; j/=5){
                res++;
            }
        }
        return res;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

zirkuläre verknüpfte Liste

Geschwindigkeitszeiger

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head == nullptr || head->next == nullptr){
            return false;
        }
        ListNode* slow = head->next;
        ListNode* fast = head->next->next;
        while(fast != nullptr){
            if(slow == fast){
                return true;
            }
            if(fast->next == nullptr){
                return false;
            }
            slow = slow->next;
            fast = fast->next->next;
        }
        return false;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

Führen Sie zwei geordnete verknüpfte Listen zusammen

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        if(list1 == nullptr){
            return list2;
        }
        if(list2 == nullptr){
            return list1;
        }
        ListNode* newHead;
        if(list1->val <= list2->val){
            newHead = list1;
            list1 = list1->next;
        }else{
            newHead = list2;
            list2 = list2->next;
        }
        ListNode* p = newHead;
        while(list1 && list2){
            if(list1->val <= list2->val){
                p->next = list1;
                p = p->next;
                list1 = list1->next;
            }else{
                p->next = list2;
                p = p->next;
                list2 = list2->next;
            }
        }

        while(list1){
            p->next = list1;
            p = p->next;
            list1 = list1->next;
        }
        while(list2){
            p->next = list2;
            p = p->next;
            list2 = list2->next;
        }
        return newHead;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

Symmetrischer Binärbaum

Fügen Sie hier eine Bildbeschreibung ein
Ein Baum ist symmetrisch, wenn sein linker und rechter Teilbaum Spiegelbilder voneinander sind.

  • Ihre beiden Wurzelknoten haben den gleichen Wert
  • Der rechte Teilbaum jedes Baums ist ein Spiegelbild des linken Teilbaums des anderen Baums

Leveldurchschnitt des Binärbaums

Breitendurchquerung
Die Suche beginnt am Wurzelknoten, durchläuft in jeder Runde alle Knoten in derselben Schicht, berechnet die Anzahl der Knoten in der Schicht und die Summe der Anzahl der Knoten in der Schicht und berechnet dann den Durchschnittswert der Schicht.

  • Zunächst wird der Wurzelknoten in die Warteschlange gestellt.
  • Während jeder Durchlaufrunde werden alle Knoten in der Warteschlange herausgenommen, die Anzahl und Summe dieser Knoten berechnet, dann der Durchschnittswert berechnet und dann alle leeren untergeordneten Knoten des Knotens zur Warteschlange hinzugefügt.
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) {
        vector<double> average;
        queue<TreeNode *> que;
        que.push(root);
        while(!que.empty()){
            double sum = 0;
            int size = que.size();
            for(int i=0; i<size; i++){
                TreeNode* node = que.front();
                que.pop();
                sum += node->val;
                TreeNode* left = node->left;
                TreeNode* right = node->right;
                if(left){
                    que.push(left);
                }
                if(right){
                    que.push(right);
                }
            }
            average.push_back(sum / size);
        }
        return average;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

Ordnungsdurchlauf auf Binärbaumebene

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        queue<TreeNode* > que;
        if(!root){
            return res;
        }
        que.push(root);
        while(!que.empty()){
            vector<int> temp;
            int size = que.size();
            for(int i=0; i<size; i++){
                TreeNode* node = que.front();
                que.pop();
                temp.push_back(node->val);
                TreeNode* left = node->left;
                TreeNode* right = node->right;
                if(left){
                    que.push(left);
                }
                if(right){
                    que.push(right);
                }
            }
            res.push_back(temp);
        }
        return res;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

Entfernen Sie Duplikate im geordneten Array

Ein geordnetes Array nums, löscht wiederholte Elemente an Ort und Stelle, sodass Elemente, die mehr als zweimal vorkommen, nur zweimal erscheinen, und gibt nach dem Löschen die neue Länge des Arrays zurück.

Das Eingabearray muss vor Ort geändert werden und unter Verwendung von O(1) zusätzlichem Speicherplatz erfolgen.

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int left = 0;
        int right = 0;
        int n = nums.size();
        int count = 0;
        int sum = 0;
        while (right < n) {
            if (nums[left] == nums[right]) {
                count++;
                right++;
            } else {
                if (count > 1) {
                    nums[++left] = nums[left];
                    sum += 2;
                } else {
                    sum += 1;
                }
                nums[++left] = nums[right++];
                count = 1;
            }
        }
        if (count > 1) {
            nums[++left] = nums[left];
            sum += 2;
        } else {
            sum += 1;
        }
        return sum;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

Array drehen

Drehen Sie bei einem gegebenen ganzzahligen Array nums die Elemente im Array um k Positionen nach rechts.

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k = k % n;
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin()+k);
        reverse(nums.begin()+k, nums.end());
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Beste Zeit, um Aktien zu kaufen und zu verkaufen

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int result = 0;
        int price = prices[0];
        for(int i=1; i<prices.size(); i++){
            if(prices[i] > price){
                result = max(result, prices[i] - price);
            }else{
                price = prices[i];
            }
        }
        return result;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Der beste Zeitpunkt, Aktien zu kaufen 2

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> dp(n,vector<int>(2)); //dp[i][0]第i天没有股票
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for(int i=1; i<n; i++){
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i]);
        }
        return dp[n-1][0];
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Springspiel

Bei einem nichtnegativen Ganzzahl-Array nums, das sich zunächst am ersten Index des Arrays befindet, stellt jedes Element im Array die maximale Länge dar, die übersprungen werden kann.
Bestimmen Sie, ob zum letzten Index gesprungen werden kann.

gierig
Für jede Position y im Array kann y auch erreicht werden, solange es eine Position x gibt, die von selbst erreicht werden kann, und x + nums[x] ≥ y.

Für jede erreichbare Position x macht es die aufeinanderfolgenden Positionen x+1, x+2, ..., x+nums[x] erreichbar.

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n = nums.size();
        int rightmost = 0;
        for(int i=0; i<n; i++){
            if(i <= rightmost){
                rightmost = max(rightmost, i+nums[i]);
                if(rightmost >= n-1){
                    return true;
                }
            }
        }
        return false;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Zickzack-Transformation

Ordnen Sie eine gegebene Zeichenfolge s in einer Z-Form von oben nach unten und von links nach rechts entsprechend der angegebenen Anzahl von Zeilen numRows an.

Fügen Sie hier eine Bildbeschreibung ein
Simulieren Sie mit 2D-Matrizen
Sei n die Länge der Zeichenfolge s, r = numRows. Für r=1 (nur eine Zeile) oder r &gt;= n (nur eine Spalte) ist die Antwort dieselbe wie s und kann direkt zurückgegeben werden.

In anderen Fällen können Sie erwägen, eine zweidimensionale Matrix zu erstellen, dann die Zeichenfolge s in einem Zickzackmuster auf der Matrix auszufüllen und schließlich die nicht leeren Zeichen in der Matrix Zeile für Zeile zu scannen, um die Antwort zu erhalten.

Entsprechend der Bedeutung der Frage füllen wir beim Ausfüllen der Zeichen in der Matrix r Zeichen nach unten, dann r-2 Zeichen nach oben nach rechts und kehren schließlich zur ersten Zeile zurück, also zur Z-förmigen Transformationsperiode t = r + r - 2 = 2r - 2. Jeder Zyklus belegt 1+r-2 = r-1 Spalten in der Matrix.

Es gibt n/t Perioden mal der Anzahl der Spalten, was gleich der Anzahl der Spalten der Matrix ist.

Erstellen Sie eine Matrix mit r Zeilen und c Spalten, durchlaufen Sie dann die Zeichenfolgen und füllen Sie sie in einem Zickzackmuster.

class Solution {
public:
    string convert(string s, int numRows) {
        int n = s.length(), r = numRows;
        if(r == 1 || r >= n){
            return s;
        }

        //变换周期
        int t = 2*r - 2;
        int c = (n + t -1) / t * (r - 1);
        //创建二维字符串
        vector<string> mat(r, string(c, 0));
        for(int i = 0, x = 0, y =0; i<n; i++){
            mat[x][y] = s[i];
            if(i % t < r - 1){
                ++x; //向下移动
            }else{
                --x;
                ++y; //向右上移动
            }
        }

        string ans;
        for(auto &row : mat){
            for(char ch : row){
                if(ch){
                    ans += ch;
                }
            }
        }
        return ans;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

Wörter in einer Zeichenfolge umkehren

class Solution {
public:
    vector<string> splitString(string s){
        istringstream iss(s);
        vector<string> res;
        string word;
        while(iss >> word){
            res.push_back(word);
        }
        return res;
    }
    string reverseWords(string s) {
        vector<string> words = splitString(s);
        string res;
        for(int i=words.size()-1; i>=0; i--){
            res += words[i] + " ";
        }
        res.pop_back();
        return res;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21