【ブラッシング質問時の注意事項】 注1

1.自守数

牛科リンク
分析:
1. 保型数値の末尾は 0、1、5、6 である必要があります。
2. 数値を文字列クラスに変換します (比較に便利です)
3. s2 で直接検索し、find を使用して別の数値を検索します。
#include <iostream>
#include<string>
using namespace std;

int fun(int n)
{
    int ret =0;
    for(int i=0;i<=n;i++)
    {
        if(i%10 == 0 || i%10 == 5 ||i%10 == 6 ||i%10 ==1)
        {
            long j =i*i;
            string s1 = to_string(i);
            string s2 = to_string(j);
            int pos = s2.size() - s1.size();
            if(s2.find(s1,pos) != string::npos)
            {
                ret++;
            }
        }  
    }
    return ret;
}
int main() {
    int n;
    while (cin >> n) { 
        cout<<fun(n)<<endl;

    }
    return 0;
}
知識ポイント:
1. to_string() 関数。
2. find の戻り値は string::npos です

2. N 未満の素数の数を返します。

トピックリンク
#include <iostream>
using namespace std;
bool fun(int n){
    for(int i = 2; i*i <= n; i++)
    {
        if(n%i == 0)
        {
            return false;
        }
    }
    return true;
}


int main() {
    int n;
    int ret = 0; 
    while(cin>>n)
    {
        ret =0;
        for(int i = 3; i<n; i+=2)
        {
            if(fun(i))
            {
                ret++;
            }
        }
    }
   cout<<ret+1;
   return 0;
}
知識ポイント:
1. 素数は 2 を除いて奇数のみです。
1. N が素数かどうかを検証する場合、根号を開くには 2 から N までを検証するだけで済みます。

3. 一度しか出現しない数字

オージーリンク
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for(auto n :nums)
        {
            ret ^= n;
        }
        return ret;
    }
};

4.陽暉三角(ベクトル)

オージーリンク
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> vv;
        vv.resize(numRows);//不给初始化值,就会调用vector<int> 的默认构造。
        for(size_t i =0; i<vv.size();i++)
        {
            vv[i].resize(i+1, 0);
            vv[i][0] = vv[i][vv[i].size()-1] = 1;
        }
        for(int i =0; i< vv.size(); i++)
        {
            for(int j=0; j< vv[i].size(); j++)
            {
                if(vv[i][j] == 0)
                {
                    vv[i][j] = vv[i-1][j] +vv[i-1][j-1];
                }
            }
        }

        return vv;
    }
};
ここでは C++ ベクトルを使用すると非常に便利です。これは C 言語よりもはるかに簡単です。
区別とc言語との違いに注意してください。

5. 電話番号のアルファベットの組み合わせ(再帰的)

ああ、トピック
class Solution {
    string _numstr[10] = {"","","abc","def","ghi","jkl","mno", "pqrs", "tuv","wxyz"};
public:


    void combine(const string& digits,size_t i , vector<string>& ret, string tmp)
    {
        if(i == digits.size())
        {
            ret.push_back(tmp);
            return;
        }
        size_t num = digits[i] - '0';
        for(auto ch :_numstr[num])
        {
            combine(digits, i+1, ret, tmp+ch);
        }
    }
    vector<string> letterCombinations(string digits) {//digits存放的是数字字符串
        vector<string> ret;//返回的值
        if(digits.empty())
        {
            return ret;
        }
        string tmp;//记录此深度的字符串组合
        size_t i =0;
        combine(digits,i,ret,tmp);
        return ret;
    }
};
再帰的思考の深い理解
この質問の主な理由は、それらが十分に直観的ではないからです。
本質はバイナリツリーの深い走査です

6. ソートされた配列内の重複を削除する

トピックリンク
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int i =0;
        for(auto n : nums)
            if(n != nums[i]) nums[++i] = n;
        return i+1;
    }
};
実際には、高速ポインタと低速ポインタ (ダブル ポインタ) です。

7. 一度だけ現れる数字 II

トピックオージ
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for(int i = 0 ;i< 32; i++){
            int val =0;
            for(auto j : nums){
                val += (j>>i)&1;
            }
            if(val % 3 ){
                ret += (1<<i);
            }
        }
        return ret;
    }
};

//法二:
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int i = 0;
        while(i < nums.size()-1){
            if(nums[i] == nums[i+1] && nums[i+1]== nums[i+2]){
                i += 3;
            }
            else{
                return nums[i];
            }
        }
        return nums[i];
    }
};

8. 一度だけ現れる数字III

トピックオージ
class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        vector<int> ret;
        int val = 0;
        for(int i : nums)
        {
            val ^= i;
        }
        int i=0;
        for( i = 0; i <32 ;i++)
        {
            if((val >> i )& 1 == 1)
            {
                break;
            }
        }
        vector<int> v1;
        vector<int> v2;
        for(int a : nums)
        {
            if((a>>i)&1 == 1)
            {
                v1.push_back(a);
            }else{
                v2.push_back(a);
            }
        }
        int b =0;
        for(int a: v1)
        {
            b^=a;
        }
        ret.push_back(b);
        b=0;
        for(int a: v2)
        {
            b^= a;
        }
        ret.push_back(b);

    return ret;
    }
};

9. 配列内に半分以上出現する数値

トピックリンク
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        sort(numbers.begin(), numbers.end());
        return numbers[numbers.size()/2];
    }
};
ベクトルを学習した後、このトピックは非常に簡単で、直接ソートして取得するだけです。

10. K の最小数

トピックオージ
class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> ret ;
        sort(input.begin(),input.end());
        for(int i =0;i<k;i++)
        {
            ret.push_back(input[i]);
        }
        return ret;
    }
};
知識のポイント:
典型的な topk 問題の場合、クイック ソート (ソートの最下層はクイック ソート)、ヒープ ソート (大規模または小規模のヒープの構築の問題) を使用できます。

おすすめ

転載: blog.csdn.net/zxf123567/article/details/129272021