演算法題 水杯倒水的問題

2021-09-23 13:49:47 字數 2887 閱讀 2044

本文將介紹以下內容:

1. 引言

上回[第八回:品味型別---值型別與引用型別(上)-記憶體有理

]的發布,受到大家的不少關注,我們從記憶體的角度了解了值型別和引用型別的所以然,留下的任務當然是如何應用型別的不同特點在系統設計、效能優化等方面發揮其作用。因此,本回是對上回有力的補充,同時應朋友的希望,我們盡力從記憶體除錯的角度來著眼一些設計的分析,這樣就有助於對這一主題進行透徹和全面的理解,當然這也是下一回的重點。

2. 通用規則與比較

通用有規則:

簡單的說是由於string的immutable特性,因此每次對string的改變都會在託管堆中產生乙個新的string變數,上述string作為引數傳遞時,實際上執行了s=s操作,在託管堆中會產生乙個新的空間,並執行資料拷貝,所以才有了類似於按值傳遞的結果。但是根據我們的記憶體分析可知,string在本質上還是乙個引用型別,在引數傳遞時發生的還是按址傳遞,不過由於其特殊的恆定特性,在函式內部新建了乙個string物件並完成初始化,但是函式外部取不到這個變化的結果,因此對外表現的特性就類似於按值傳遞。至於string型別的特殊性解釋,我推薦artech

的大作《深入理解string和如何高效地使用string

》。另外,string型別過載了==操作符,在型別比較是比較的是實際的字串,而不是引用位址,因此有以下的執行結果:

string astring = "123";

string bstring = "123";

console.writeline((astring == bstring)); 

//顯示為true,等價於astring.equals(bstring);

string cstring = bstring;

cstring = "456";

console.writeline((bstring == cstring)); 

//顯示為false,等價於bstring.equals(cstring);

public

struct mystructtester

public

class isvaluetype_test

belongs to value type.", astruct.tostring()); }

} }

mystruct atest;

console.writeline(atest.x); 

char a = 'c';

char b = 'c';

console.writeline((a.equals(b))); 

//會返回true; 

比較出真知:

3. 對症下藥-應用場合與注意事項

現在,在記憶體機制了解和通用規則熟悉的基礎上,我們就可以很好的總結出值型別和引用型別在系統設計時,如何作出選擇?當然我們的重點是告訴你,如何去選擇使用值型別,因為引用型別才是.net的主體,不必花太多的關照就可以贏得市場。

3.1 值型別的應用場合

3.2 引用型別的應用場合

4. 再論型別判等

型別的比較通常有equals()、referenceequals()和==/!=三種常見的方法,其中核心的方法是equals。我們知道equals是system.object提供的虛方法,用於比較兩個物件是否指向相同的引用位址,.net framework的很多態別都實現了對equals方法的重寫,例如值型別的「始祖」system.valuetype就過載了equal方法,以實現對例項資料的判等。因此,型別的判等也要從重寫或者過載equals等不同的情況具體分析,對值型別和引用型別判等,這三個方法各有區別,應多加注意。

4.1 值型別判等

4.2 引用型別判等

public

virtual

bool equals(

object obj);

public

static

bool equals(

object obja, 

object objb);

一種是虛方法,預設為引用位址比較;而靜態方法,如果obja是與objb相同的例項,或者如果兩者均為空引用,或者如果obja.equals(objb)返回true,則為true;否則為false。.net的大部分類都重寫了equals方法,因此判等的返回值要根據具體的重寫情況決定。 

有必要在自定義的型別中,實現對equals和==的重寫或者過載,以提高效能和針對性分析。 

5. 再論型別轉換

型別轉換是引起系統異常乙個重要的因素之一,因此在有必要在這個主題裡做以簡單的總結,我們不力求照顧全面,但是追去提綱挈領。常見的型別轉換包括:

(type)(變數、表示式)

static 訪問修飾操作符 轉換修飾操作符 

operator 型別(引數列表);

public student

//其中,所有的轉換都必須是static的。  

6.結論

現在,我們從幾個角度延伸了上回對值型別和引用型別的分析,正如本文開頭所言,對型別的把握還有很多可以挖掘的要點,但是以偏求全的辦法我認為還是可取的,尤其是在技術探求的過程中,力求面面俱到的做法並不是好事。以上的幾個角度,我認為是對值型別和引用型別把握的必經之路,否則在實際的系統開發中常常會在細小的地方栽跟頭,摸不著頭腦。

品味型別,我們以應用為要點撬開值型別和引用型別的規矩與方圓。

演算法題 水杯倒水的問題

之前好像在看到這樣的題目 1.有3個容器,各是20公升,13公升,7公升,形狀不同也不透明。一開始20公升的容器裡面裝了20公升水,反正倒來倒去最後要讓20公升和13公升容器各裝了10公升水 2.2個外形不同的瓶子,各裝800毫公升水,另外還有1個300毫公升的杯子 現在有4個人,不限制喝的次數,想...

3水杯倒水問題

問題 給出三個杯子的容量abc 其中剛開始時c杯是滿的,ab是空的。現在在保證不會有漏水的情況下進行如下操作 將乙個杯子x的水倒到另乙個杯子y中,如果x空了或者y滿了就停止 滿足其中乙個條件才停下 現問c中水量有多少種可能性 a,b,c為非負整數 解法1 數論,擴充套件歐幾里得 待補充解法2 模擬倒...

廣度優先搜尋 水杯倒水問題

三個水杯 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入 第...