50,779
社区成员
发帖
与我相关
我的任务
分享
title: 算法训练第30日
date: 2022-07-31 20:28:25
summary:
tags:
categories:
回文链表
/**
* 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:
bool isPalindrome(ListNode* head) {
vector<int> temp;
while (head != nullptr){
temp.push_back(head -> val);
head = head -> next;
}
int l = 0,r = temp.size() - 1;
while (l < r){
if (temp[l] != temp[r]) return false;
l++;
r--;
}
return true;
}
};
分割回文串
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> res;
vector<string> cur;
dfs(s,cur,res);
return res;
}
bool isPalindrome(string s){
return s==string(s.rbegin(),s.rend());
}
void dfs(string s,vector<string> &cur,vector<vector<string>> &res){
if (s==""){
res.push_back(cur);
return;
}
for (int i = 1; i <= s.length(); ++i) {
string sub=s.substr(0,i);
if (isPalindrome(sub)){
cur.push_back(sub);
dfs(s.substr(i,s.length()-i),cur,res);
cur.pop_back();
}
}
}
};
回文素数
class Solution {
public:
int get(int x)
{
string a=to_string(x);
string b=a;
reverse(b.begin(),b.end());
return stoi(a+b.substr(1));
}
bool is_prime(int n){
if(n<2) return false;
for(int i=2;i*i<=n;i++)
if(n%i==0) return false;
return true;
}
int primePalindrome(int n) {
//偶数个数的回文串都是11的倍数,所以不是素数
//那么偶数个数的回文素数只有11
if(n>7&&n<=11) return 11; //如果是8到11范围内的数要求是回文数并且又是素数就都是11
//判断奇数个数的回文素数
for(int i=1;;i++){
int x=get(i); //得到以i为一半的回文数字
if(n<=x&&is_prime(x)){
return x;
}
}
}
};
计数质数
class Solution {
public:
// 规律:如果i是质数,那么2i、3i、4i...都不是质数
// 时间复杂度为O(nlog(logn))
int countPrimes(int n) {
int ans = 0; // 表示结果的数量
vector<bool> notPrimes(n); // 新建一个bool类型、大小为n的数组容器
for (int i = 2; i < n; i++) {
if (notPrimes[i]) continue; // 如果不是质数,则跳过当前这个循环
else ans++; // 是质数,ans要加一
// 如果i是质数,那么2i、3i、4i...都不是质数
for (int j = i; j < n; j += i) {
notPrimes[j] = true;
}
}
return ans;
}
};