毎日の練習は、バックルを強制します

検索挿入位置(シンプル)

ソートされた配列とターゲットを考えると、配列内のオブジェクトを検索し、そのインデックスを返します。標的がアレイに存在しない場合、それが配列に挿入された位置に戻されます。

あなたは、アレイ内のことは、重複要素をとることができます。

問題解決:

私たちはソートされた配列の中で、目標値の存在は半ばインデックスに直接戻されたときに、目標値が配列の中に含まれていない場合がソートされていることを知っているので、単純な二分探索問題、そして我々は、whileループの最後から二番目の結果を分析することができます時間に、右、最初の要素として、特定の要素を標的この時間がマイナス値の右に続いて、目標値目標より大きい=ままにしておく必要があり、whileループを終了します。したがって、我々は、左ターゲット要素に対応するこの時間インデックスが目標位置に挿入されるべきであることを見ることができます。

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        while(left <= right) {
            int mid = left + ((right - left) >> 1);
            if(nums[mid] == target) {
                return mid;
            }
            else if(nums[mid] < target) {
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
        }
        return left;
    }

};

列数の出現(単純)

「列の出現数が」番号1から始まる整数の配列で、配列内の各アイテムの前の説明です。次のように最初の5つは次のとおりです:

列の数の外観
1 1
2 11
3 21
4 1211
5 111221

どこで:

  • 1 "は、1つ1"( "A")、すなわち、11として読み取られます。
  • 11「は、2つの1」(「2つの1」)、すなわち、21として読み取られます。
  • 21は、 "1 2"、 "1 1"( "2"、 "A")として、すなわち、1211読み出されます。

正の整数N(1≤N≤30)は、n番目の直列用語出力外観を与え。

注:整数の各シーケンスは、文字列として表現されます。

問題解決:

この質問は難しいことではありません、それはトップ5のパズルシリーズの外観を与えるための方法であるとき、この質問をしたとき、私は米国のミッションラインでのインタビューの前のようにそれを考え、問題を理解する上で重要です私は第六を書いてみましょう、今好転、反応しなかったとコラムのタイトルアブストラクトの外観のものを、このワードカウントを実現していませんでした。いくつかの単語の男は、この質問を分析し、その後、前記:列の外観は、実際には、一連の反復の数は、説明するために私たちの例の数を記載しています。

  • まず、第1の数は、予め指定された数です。
  • 、第1番の第2の数が第二の数は11であり、1 1を有し、次に説明します。
  • 、第11番の第2の数が第3の数は21であり、2 11 1を有しており、次に説明します。
  • 、第3の数21の第四の数は、第四の数は1211であり、それによって、21 2 1を有し、次に説明します。
  • 次に、第4,5番号1211の数は111221に1211年1および2 1及び2、及び第五の、従って数を有し、説明します。

この時間は、我々は最終的に私たちのコードを開始するには、質問の意味を理解します:

class Solution {
public:
    string countAndSay(int n) {
        string str, res;
        res = "1";
        if (n == 1) return res;
        for (int i = 1; i < n; ++i)
        {   
            str = res;
            res = "";
            for (int j = 0; j < str.size();)
            {
                // c为计数器,k为当前描述数字对应下标
                int c=0,k=j;
                // 若k合法且str[k]重复则计数
                while(k<str.size()&&str[k]==str[j])
                {
                    ++k;
                    ++c;
                }
                res+=to_string(c)+str[j];
                j=k;
            }
        }
        return res;
    }
};

最後に、ワード長(シンプル)

小文字のみ、スペースを含む文字列「」最後の単語の長さを戻します。

最後の言葉が存在しない場合は、0が返されます。

説明:単語が文字によって定義されていますが、文字列の空白が含まれていません。

問題解決:

この質問は、特殊なケースは考慮するための焦点であります:

  • このときの第1の場合、「Hello Worldのは」、最後の言葉を返すの長さの世界5
  • 後者の場合、「Hello World」の、処理空間の終了後にこの時間は、世界で最後の単語の長さ5に戻る必要があります

優れた特殊な状況を分析した後、コードを書いて起動します。

class Solution {
public:
    int lengthOfLastWord(string s) {
        int last = s.size();
        for(int i = s.size() - 1; i >= 0; --i)
        {
            if(s[i] == ' ')
                last = i;
            else
                break;
        }
        int flag = 0;
        for(int i = 0; i < last; ++i)
        {
            if(s[i] == ' ')
            {
                flag = i + 1;
            }
        }
        return last - flag;
    }
};

バイナリ和(シンプル)

2つのバイナリ文字列を考えると、その(バイナリで表される)に戻ります。

入力されている非空の文字列と数字だけが含まれています  1 と  0

問題解決:

逆和は、タグビットに、空0です。

class Solution {
public:
    string addBinary(string a, string b) {
        string ans = "";
        int ca = 0;
        for(int i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0; --i, --j)
        {
            int sum = ca;
            sum += i >= 0 ? a[i] - '0' : 0;
            sum += j >= 0 ? b[j] - '0' : 0;
            ans = to_string(sum % 2) + ans;
            ca = sum / 2;
        }
        if (ca == 1)
            ans = to_string(ca) + ans;
        return ans;
    }
};

X乗(シンプル)

int型のsqrt(int型x)関数を実現します。

計算戻るxは非負の整数であり、xの平方根。

戻り型が整数であるため、結果の整数部は、小数部を切り捨て保持します。

問題解決:

この質問はまた半分の変形が探している他の言葉で、ニュートン法として知られています。バイナリ検索についてのブログがある前に、あなたは私がブログを読んで、特定のものを見ることができます。

class Solution {
public:
    int mySqrt(int x) {
        long left = 0, right = x/2 + 1;
        while(left <= right)
        {
            long mid = left + ((right - left) >> 1);
            if(mid * mid > x)
            {
                right = mid - 1;
            }
            else
            {
                if((mid == x/2 + 1) || (mid+1) * (mid+1) > x)
                    return mid;
                else
                    left = mid + 1;
            }
        }
        return -1;
    }
};

クライミング階段(シンプル)

あなたは階段を登っていると仮定します。ニード  nは  あなたの屋根に到達するため。

たびに、1つまたは2つのステップを登ることができます。どのように多くの異なる方法がそれの屋根に登ることができますか?

注:与えられた  nは  正の整数です。

問題解決:

導出単に派生式:A [N] = A [N-1] + A [N-2]さらなる解決策:

class Solution {
public:
    int climbStairs(int n) {
        if (n < 3)
            return n;
        const int len = n+1;
        int a[len];
        a[1] = 1;
        a[2] = 2;
        for(int i = 3; i <= n; ++i)
        {
            a[i] = a[i-1] + a[i-2];
        }
        return a[n];
    }
};

削除は、繰り返し要素のリスト(簡単な)をソート

ソートされたリストを考えると、各要素が1回だけ発生だから、すべての重複要素を削除します。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* current = head;
        while (current != nullptr && current->next != nullptr) {
            if (current->next->val == current->val) {
                current->next = current->next->next;
            } else {
                current = current->next;
            }
        }
        return head;
    }
};

同じツリー(シンプル)

2つのバイナリツリーを考えると、それらが同一であるかどうかを確認する関数を記述します。

2は、構造ツリーに同一であり、ノードが同じ値を持っている場合、それらは同一とみなされます。

問題解決:

再帰的解決へ:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(p == nullptr && q == nullptr)
            return true;
        else if(p == nullptr || q == nullptr)
            return false;
        else if(p->val != q->val)
            return false;
        return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    }
};

 

公開された37元の記事 ウォン称賛42 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_42570248/article/details/103956338