兩條單鏈表如果交叉的話不可能一條有環一條沒有環。
已知有個rand7()的函式,返回1到7隨機自然數,讓利用這個rand7()構造rand10() 隨機1~10
(rand7()-1)*7得到乙個離散整數集合a=,其中每個整數的出現概率也都是1/7。而rand7()得到的集合b=中每個整數出現的概率也是1/7。顯然集合a和b中任何兩個元素組合可以與1-49之間的乙個整數.去除41到49的數剩下的還是隨機分布的數。生成的數對10取模+1就可以隨機產生1~10
js與c++的區別之處
#include using std::cin;
using std::cout;
int i = 0;
void print()
; longestascseq(a,sizeof(a)/sizeof(int));
}void longestascseq(int a,int n)
} } }
printsequence(c,a,lastindex);
cout《給乙個浮點數序列,取最大乘積連續子串的值,例如 -2.5,4,0,3,0.5,8,-1,則取出的最大乘積連續子串為3,0.5,8。也就是說,上述陣列中,3 0.5 8這3個數的乘積3*0.5*8=12是最大的,而且是連續的。
注意子串和子串行的區別,子串是連續的,子串行不要求連續
1 我能想到的,就是類似於最大子串和的解法,三層迴圈or兩層迴圈遍歷
2 ** 這裡的問題是人為設定了乙個空集的乘積為1,1為邊界類似於求最大連續和字串中的0,任何數乘以小於1的數模值都會變小,但最大連續和字串中的0還是有意義的表示乙個都不取,但這裡的1.。。實在有點牽強。
變體:此外,此題還有另外的乙個變種形式,即給定乙個長度為n的整數陣列,只允許用乘法,不能用除法,計算任意(n-1)個數的組合中乘積最大的一組,並寫出演算法的時間複雜度。
動態規劃求最小連續乘積
鍊錶相鄰元素翻轉,如a->b->c->d->e->f-g,翻轉後變為:b->a->d->c->f->e->g
#include using namespace std;
/* 刪除字串開始及末尾的空白符,
把陣列中間的多個空格符轉化為1個
演算法和乙個字串中刪除指定集合的字元類似,
兩指標一指向位置一遍歷字串,o(n)複雜度
*/void deleteblank(char *str)
else if(*q==' '&&needed)
}//這裡最後乙個如果是空格的話也會留下來
if(p==str)//所有都是空格
else
// 列印
int i =0;
for(p=str;*p!='\0';p++)
i++;
cout<
鍊錶轉殖。鍊錶的結構為:
typedef struct list list;
kmp演算法
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次;乙個陣列裡,除了三個數是唯一出現的,其餘的都出現偶數個,找出這三個數中的任乙個;
#include using namespace std;
/* 找出陣列中唯一兩個只出現一次的數字
所有異或運算然後結果從頭開始移位找到第乙個最右邊的1
然後按照這位1將陣列分成兩組,這兩組數字分別進行異或就是結果
*//*
實際上這種可以設計合適的hash函式or排序二叉樹實現
*/void find(int ,int);
int main()
; find(a,sizeof(a)/sizeof(int));
cin.get();
}void find(int a,int n)
; find(a,sizeof(a)/sizeof(int));
cin.get();
} void find(int a,int n)
; int b = [3,4,6,6,8,10,10];
歸併成 a = ;
b =
演算法思路是:
先找a中比b[0]小的數到第乙個大於停止,標記為i,此時i指向5
然後找b中比5小的數到第乙個大於為止,標記為j,此時j指向6
然後將5,7,9,3,4看成乙個整體,使用左旋字串的方法旋轉成3 4 5 7 9
此時a中為1 2 3 4 5,b中為7,9,6,6,8,10,10,則開始起始點i
為5(原始位置+移過來兩元素),j為原始的地方6,繼續上訴過程
*//*
a、b 要旋轉的陣列
n a的長度
start 左旋串的起始位置
end 左旋串的終點位置
num 左旋的起始位置
*/ void rotateleft(int *a,int n,int *b,int start,int end,int num);
/* 兩個陣列起始位址和長度
*/ void merge(int*,int,int*,int);
int main()
; int b = ;
merge(a,sizeof(a)/sizeof(int),b,sizeof(b)/sizeof(int));
for(int i=0;in-1)
else if(i>n-1)
}for(int i=end-num+1,j=end;in-1)
else if(i>n-1)
}for(int i=start,j=end;in-1)
else if(i>n-1)
}}void merge(int a,int n,int b,int m)
while(j=b[j-n])||(i=n&&b[j-n]<=b[i-n])))
if(i>=j)
break;
else
}
}
當用到計數器的時候一定要注意計數器的清空!!!!!!!! 收集的一些題or結論2
include using namespace std 已知字串裡的字元是互不相同的,按照字典序輸出所有的組合,比如ab輸出aa,ab,ba,bb。思路 1 要字典序,所以要首先對陣列排序 氣泡排序的第一層迴圈只是用來控制做多少次的,和第二層迴圈基本沒聯絡 2 乙個完整的輸出 填入乙個字元 填入剩下...
一些刷題過程中的結論
uva 10313 整數i拆分成不超過j個整數的拆分方案數,是和整數i拆成若干個值不超過j的整數的拆分方案數是相同的 原理 ferrers影象 詳 關於c 引用帶的的不易發現的錯誤。來自於乙個4維dp。uva 10913 例如int res dp i j p q 如果在這個記憶化搜尋子過程中需要更新...
博弈論的一些結論
感謝 自從昨天考了博弈論的一道程式填空題,博弈論的陰雲便一直在我的心上徘徊,今天把這個坑填一下。一.巴什博弈 bash game a和b一塊報數,每人每次最少報乙個,最多報四個,看誰先報到三十.這應該是最古老的關於巴什博弈的遊戲了吧。其實如果知道原理,這遊戲一點運氣成分都沒有,只和先後手有關,比如第...