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 問題の場合、クイック ソート (ソートの最下層はクイック ソート)、ヒープ ソート (大規模または小規模のヒープの構築の問題) を使用できます。