アルゴリズムキャンプ8日目

ニウケ回文索引

タイトルの説明
小文字のみで構成される文字列が与えられます。場所を見つけてください。その文字を削除すると、文字列は回文になります。法的解決策は常にありますのでご安心ください。指定された文字列が既に回文である場合、-1を出力します。

アイデア:
回文番号は正面から読み取られ、背面から読み取られます。取得される順序は同じです。

  1. 文字列が既に回文である場合、-1を直接出力します
  2. パリンドロームでない場合は、末尾を削除して再度確認してください。パリンドロームの場合、出力端
  3. それ以外の場合、出力は
    PSで始まります。このトピックは、コードを理解することが依然として困難
    です。
#include<iostream>
#include<string>
using namespace std;
bool Ispalindrome(string& s,int* start, int* end){
    
    
    int i = 0;
    int j = s.size()-1;
    bool result = true;
    while(i <= j){
    
    
        if(s[i] != s[j]){
    
    
            result =  false;//注意这里是改变result的值
            break;
        }
        i++,j--;
    }
    if(start != nullptr) *start = i;
    if(end != nullptr) *end = j;
    return result;
}

int main(){
    
    
    int num = 0;
    cin >> num;
    while(num--){
    
    
        string str;
        cin >> str;
        int start = 0;
        int end = str.size() -1;
        if(Ispalindrome(str, &start, &end)){
    
    
            cout<< -1<<endl;
        }
        else{
    
    
            str.erase(end, 1);
            if(Ispalindrome(str, nullptr, nullptr)){
    
    
                cout<<end<<endl;
            }
            else{
    
    
                cout<<start<<endl;
            }
        }
    }
}

Niu Keは配列を最小数に配置します

タイトルの説明
正の整数の配列を入力し、配列内のすべての数値を結合して数値を形成し、スプライス可能なすべての数値のうち最小の数値を出力します。たとえば、配列{3、32、321}を入力し、これらの3つの数値が321323として配置できる最小の数値を出力します。

アイデア:
代替のソートでは、新しいファンクターの定義が必要です。
コード:

class Solution {
    
    
public:
    static bool cmp(int a, int b){
    
    
        string A = "";
        string B = "";
        A += to_string(a);
        A += to_string(b);
        B += to_string(b);
        B += to_string(a);
        return A < B;
    }
    string PrintMinNumber(vector<int> numbers) {
    
    
        string res ="";
        sort(numbers.begin(), numbers.end(),cmp);
        for(int i = 0;i<numbers.size();++i){
    
    
            res += to_string(numbers[i]);
        }
        return res;
    }
};

二分木の深さ

タイトルの説明
バイナリツリーを入力し、ツリーの深さを見つけます。ルートノードからリーフノードに順番に通過するノード(ルートとリーフノードを含む)は、ツリーのパスを形成します。最長のパスの長さは、ツリーの深さです。

アイデア:
再帰的に、左側のサブツリーと右側のサブツリーの最大値を見つけ、+ 1はツリー全体の高さコードです

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
    
    
public:
    int TreeDepth(TreeNode* pRoot)
    {
    
    
        if(nullptr == pRoot)
            return 0;
        return 1 + max(TreeDepth(pRoot->left),TreeDepth(pRoot->right));
    }
};

アイデア:
各レイヤーの成熟度を記録するBFSレイヤーシーケンストラバーサルの実現は、次のようなコードになり
ます。

在这里插入代码片

Niukeの2つのリンクリストの最初のパブリックノード

タイトルの説明
2つのリンクリストを入力して、それらの最初の共通ノードを見つけます。(着信データはリンクされたリストであるため、着信データが正しいことを確認するために、間違ったテストデータのプロンプトが他の方法で表示されることに注意してください)

アイデア:
コード:
リンクリストの一般的な質問タイプ

おすすめ

転載: blog.csdn.net/qq_35353824/article/details/107610500