プログラミング問題のまとめ
18815 ワード
例えば、a 1->a 2->c 1->c 2->c 3;//チェーンテーブル1 b 1->c 1->c 2->c 3;//チェーンテーブル2
for(int i=0,j=n-1;i<j;++i,--j)
swap(str[i],str[j]);
for(int i=n,j=len-1;i<j;++i,--j)
swap(str[i],str[j]);
for(int i=0,j=len-1;i<j;++i,--j)
swap(str[i],str[j]);
同理,右シフトnビット:(総長len)
string ReverseSentence(string str) {
int mark=0;
int i;
int len=str.size();
if(len==0) return str;
str+=' '; // ,
for(i=0;i<len+1;++i) // , 1
{
if(str[i]==' ')
{
Reverse(str,i-1,mark);
mark=i+1;
}
}
str=str.substr(0,len); //
for(int j=len-1,i=0;i<j;++i,--j)
swap(str[i],str[j]);
return str;
}
void Reverse(string &str,int i,int m)
{
while(m<i)
{
swap(str[m],str[i]);
m++;
i--;
}
}
// vector a;
int C[256]={0};
for(int i=0;i<a.size();++i)
{
C[a[i]]=C[a[i]]+1; //
}
for(int i=0;i<a.size();++i)
{
if(C[a[i]]==1) //
return a[i];
}
5.チェーンテーブルの中のリング:まず定理を言います:2つのポインタは1つのfast、1つのslowは同時に1つのチェーンテーブルの頭部から出発します;fastは1回2歩、slowは1回1歩、もしこのチェーンテーブルにリングがあれば、2つのポインタは必ずリング内で出会うこの時、そのうちの1つのポインタをチェーンテーブルの頭に再び指さすだけで、もう1つは変わらない(まだリング内)、今回2つのポインタは1回1歩、出会った場所は入口ノードです.
このリングの長さを探すにはfastとslowのステップ長を一定に保つだけで、両者が再び出会ったとき、slowが歩く総ステップ数はリングの長さです.
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead == NULL){
return NULL;
}
ListNode* meetingnode = MeetingNode(pHead);
if(meetingnode == NULL){
return NULL;
}
ListNode* pNode1 = meetingnode;
// ,
ListNode* pNode2 = pHead;
while(pNode1 != pNode2){
pNode1 = pNode1->next;
pNode2 = pNode2->next;
}
return pNode1;
}
private:
// ,
ListNode* MeetingNode(ListNode* pHead){
ListNode* pSlow = pHead->next;
if(pSlow == NULL){
return NULL;
}
ListNode* pFast = pSlow->next;
while(pFast != NULL && pSlow != NULL){
if(pFast == pSlow){
return pFast;
}
pSlow = pSlow->next;
pFast = pFast->next;
if(pFast != NULL){
pFast = pFast->next;
}
}
return NULL;
}
};
https://blog.csdn.net/weixin_38075257/article/details/87921436