取石子兒和拿撲克牌問題

Tang和Jiang非常喜歡玩一種有趣的小遊戲:有N個石子,兩人輪流從中取出1個, 3個或4個石子,當石子被取空時,遊戲結束。最後一個取石子的人獲勝,第一次總是Tang取.當然,他們倆都足夠聰明,總會採取最優的策略。演算法思想(使用遞迴):當剩餘為1、3、4的時候先手者必勝;如果當前數目不是這三個數字,則遞迴採用去1或3或4,只要其中有一種方式使得剩下的字兒使對方輸,則先手者必勝;否則後手者勝。代碼如下:#include <iostream>using namespace

把一個連續數序列打亂判斷少了那些數

http://hxraid.iteye.com/blog/618153. 問題:100個連續的數打亂之後,隨機取出1個數,問如何最快速的判斷出少了哪一個?分析:對於所有100個連續的數,只要除餘100。一定在0~99之間。一般來說,比較常規的做法就是先排序(利用Hash表定位),在迴圈尋找。當然時間複雜度是O(2n)。現在介紹一種很牛的O(n)做法:求二進位異或運算。異或運算: 0^0=1^1=0;

利用數組計算n的階乘(n比較大的情況)和末尾0的個數

//利用數組計算n的階乘(n比較大的情況)和末尾0的個數//轉自:http://www.cnblogs.com/phinecos/archive/2009/05/03/1448245.html//簡單起見,不考慮負號的情況#include <iostream>#include <vector>#include <algorithm>using namespace std;string add(string num1, string

Regex基礎知識和ipv4的Regex

Regex基礎知識http://deerchao.net/tutorials/regex/regex.htm#metacode句點符號”.”:匹配除了分行符號意外的任意一個字元方括弧”[ ]”:匹配方括弧之內的任意一個字元或符號”|”: 表達邏輯或的關係星號”*” : 出現0次或者多次加號”+” : 出現一次或者多次問好”?” :

老鼠喝酒問題(二進位編碼的妙用)

老鼠喝酒問題一共1000瓶酒,其中一瓶有毒。如果一隻老鼠喝了有毒的酒,會在一天之後死亡,那麼如果給你一天時間,然你判定哪瓶酒有毒,至少需要幾隻老鼠?答案是10隻。這個需要使用二進位編碼來解決,1000瓶酒至少需要10位位元來進行編碼。然後取十隻杯子分別代表這是個位元的十個位,分別將1000瓶酒倒入其編碼為1的對應的杯子中。取十個老鼠分別喝十個杯子中的酒,一天之後,就可以根據喝那個杯子的老鼠死掉來確定出有毒的那瓶酒的編碼,從而確定哪瓶酒有毒。其根據就是只有有毒酒的編碼對應的毒死老鼠的杯子位置。這個

虛函數調用,虛繼承時候vtable特殊情況

#include <iostream>using namespace std;class A{public:virtual void func(){cout << "A..." << endl;}};class B:public A{public:virtual void func(){cout << "B..." << endl;}virtual void f(){cout << ".................."

物件導向思想解決的問題以及物件導向的三個特徵

http://www.cnblogs.com/seesea125/archive/2012/04/03/2431176.html物件導向是為瞭解決系統的可維護性,可擴充性,可重用性。但是物件導向為什麼可以解決這些問題呢?物件導向產生的曆史原因有下面兩點: 1、電腦是協助人們解決問題的,然而電腦終究是個機器,他只會按照人所寫的代碼,一步一步的執行下去,最終得到了結果,因此無論程式多麼的複雜,電腦總是能輕鬆應付,結構化編程,就是按照電腦的思維寫出的代碼,但是人看到這麼複雜的邏輯,就無法維護和擴充了。

Junit使用基礎總結

典型的使用JUnit的方法就是繼承TestCase類,然後重載它的一些重要方法:setUp()、teardown()、runTest()(這些都是可選的),TestCase通過setUp和tearDown來自動建立和銷毀fixture。它會在運行每個測試之前調用setUp,並且在每個測試完成之後調用tearDown。TestCase類還實現了Assert類,該類中定義了8個核心方法。另外還有兩個重要的介面:Test和TestListener。 1.Test, 包含兩個方法:run()

Window線程池實現和解析、#pragma和建構函式參數列表基礎知識

先上實現代碼:(轉自:http://blog.csdn.net/pjchen/article/details/170606)#ifndef _ThreadPool_H_#define _ThreadPool_H_#pragma warning(disable: 4530)#pragma warning(disable: 4786)#include <cassert>#include <vector>#include <queue>#include

什麼情形下適合使用線程池技術

線程池適用情況:單位時間內處理數目巨大的串連請求,但處理時間相對較短。主要特點就是使用與建立技術,將線程建立和銷毀本身帶來的開銷分攤到具體任務上,任務執行次數越多,則節省時間越多。再有一個就是線程池採用與建立技術建立的線程池規模一般有一個上界,可以解決一些伺服器無法同時建立一定量數目線程的問題。線程池將與線程執行相關的任務進行了高層次的抽象,使之與具體的執行任務無關。另外該線程池具有動態伸縮性,它能根據執行任務的輕重自動調整線程池中線程的數量.(除了使用waitxxx也可以手動掛起啟動線程來實現

使用迴圈單鏈表解決約瑟夫環問題

#include <iostream>#include <typeinfo>#include <stdio.h>using namespace std;typedef struct LNode{int data;struct LNode* link;}LNode,*LinkList;void JOSEPHUS(int n,int k,int m){//n為總人數,k為第一個開始報數的人,m為出列者報的數LinkList

輸入一行字串,找出其中的相同且長度最長的字串P227

#include <iostream>#include <string>using namespace std;//輸入一行字串,找出其中的相同且長度最長的字串P227pair<string,int> fun(string s){string str=s;string tem;int maxlen=0;pair<string,int> res;//雙重迴圈+長度判斷取出字串的所有子串for (int i=str.length()-1;i>0;

關於尋找中位元

http://lu007heng.iteye.com/blog/942722今天無意中看到一篇關於快速排序的文章。毫無疑問,快速排序正如他的名字一樣,如果不是一些特殊情況(基本有序了,排序項目個數較少),他一般是最快的排序。但是,在快速排序中一般會有一個第一步選取切分值的過程。在快速排序中,這個值我們一般是隨機抽取的,或者直接選取最右端或左端的數。但是,快速排序的一個變種是第一步選取這個值為中位元。於是,到了我關心的地方,中位元演算法。一種流行的方法是基於searchKth()方法的。這種方法的

將一句話裡的單詞進行倒置,標點符號不倒換P228

#include <iostream>#include <string>using namespace std;//將一句話裡的單詞進行倒置,標點符號不倒換P228void rever(char *str){int j=strlen(str)-1;int i=0;while (i<j){char tmp=str[i];str[i]=str[j];str[j]=tmp;i++;j--;}}void reverWord(char *str){int i=0;int

筆試快速排序

忘了遞迴終止條件!!!改正。#include <iostream>using namespace std;int divide(int a[], int left, int right){int low=left,high=right;int temp=a[low];while(low<high){while(low<high && a[high]>temp)high--;a[low]=a[high];while(low<high &&

從n個元素中選取第k大的元素,設計一個演算法並說明演算法複雜度

1.維護一個k大小的小頂堆,建堆的過程複雜度為k/2*logk,之後將之後的元素每個都和堆頂元素比較,如果比堆頂元素大則替換堆頂元素之後調整堆,每次調整堆的複雜度是logk,最壞情況是之後的都一個比一個大,這時複雜度為(n-k)*logk;所以總的時間複雜度就是(k/2+n-k)*logk=(n-k/2)*logk,空間複雜度為k2.使用敗者樹,維護一個k個節點的完全二叉樹,第一次找出其中最小的節點,複雜度為logk,之後每次都和這個最小的節點比較,如果大於這個節點,則替換這個節點再找出替換之後

將數字字串格式轉換為原來字串中出現的字元+該字元連續出現的次數的字串P231

#include <iostream>#include <string>using namespace std;//將數字字串格式轉換為原來字串中出現的字元+該字元連續出現的次數的字串P231string func(string str){//string strChar;//string strNum;string ret;int len=str.length();for (int i=0;i<len;i++){//當是連續字元時,跳過並將計數加一int

把1,4,5-8,9,89,11-14 => 1,4-9,11-14,89

//把1,4,5-8,9,89,11-14 => 1,4-9,11-14,89//思路:先把這個字串使用strtok按照","記性分解;//把每個字元分解好的串中的"-"進行解析;//把解析之後的轉成數字數組並排序//把排好序的數字數字串連成目標字串#include <iostream>#include <string>#include <vector>#include <algorithm>#include <stdlib.h>

cin與getline 和 八位元的表達方式

轉自:http://hi.baidu.com/05104106/blog/item/7b7e8a77c68b5b13b151b9f2.htmlcin.get()與cin.getline()區別在於前者對於終止符(terminator)“不拋棄,不放棄”,後者捨棄。string.h中的getline(istream,string)與cin.getline(string,streamsize)類似,但輸入字串後,斷行符號在VC6下可能要按兩次,Dev C++下不會。cin.get()參數有四種,從0

typedef和define的主要區別

typedef char* string_t;#define string_d char*//#define String_d char * 只是做了個簡單的替換? typedef char *String_t 定義了一個新的類型//主要區別在於這種使用方式String_t a,b;String_d c,d; a,b ,c都是char*類型,而d為char類型// 翻譯過來(char*)a,b;char* a,b;//#ifdef String_d 還有#ifdef String_t,

總頁數: 61357 1 .... 17382 17383 17384 17385 17386 .... 61357 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.