js數(shù)據(jù)結(jié)構(gòu)與算法

變量作用域

作用域指在編寫的算法函數(shù)中,我們能訪問的變量榕酒。有本地變量和全局變量兩種胚膊。

var myVaribale = 'global';
myOtherVaribale = 'global';

function myFunction(){
    var myVaribale = 'local';
    return myVaribale;
}

function myOtherFunction(){
    myOtherVaribale = 'local';
    return myOtherVaribale;
}     

console.log(myVariable);//'global'
console.log(myFunction());//'local'

console.log(myOtherVaribale);//'global'
console.log(myOtherFunction());//'local'
console.log(myOtherVaribale);//'local'

操作符

編程語言里都需要操作符。在JS里有算數(shù)操作符想鹰、賦值操作符紊婉、比較操作符、邏輯操作符辑舷、位操作符喻犁、一元操作符和其他操作符。

//算數(shù)操作符                                                 //賦值操作符
+                            加法                           =                   賦值
-                            減法                           +=                 加/賦值(x += y) == (x = x + y)          
*                            乘法                           -=                 減/賦值(x -= y) == (x = x - y)  
/                            除法                          *=                  乘/賦值(x *= y) == (x = x * y)  
%                            取余                          /=                  除/賦值(x /= y) == (x = x / y)  
++                           遞增                          %=                  取余/賦值(x %= y) == (x = x % y)  
--                           遞減

//比較操作符                                                //邏輯操作符
==                           相等                             &&                   與
===                          全等                             ||                   或
何缓!=                          不等                              肢础!                   非
>                            大于
>=                           大等于
<                            小于
<=                           小等于

真值假值

數(shù)值類型                                         轉(zhuǎn)換成布爾值
undefined                                        false
null                                                  false
布爾值                                              true--true,false ---false
數(shù)字                                                 0和NaN----false,其他都是true
字符串                                              空字符串為 false,其他都是true
對象                                                 true 
注:new 出來的為對象始終為true  (new String('') ---- true)

相等操作符

類型(x)                        類型(y)                              結(jié)果
null                                  undefined                            true
數(shù)字                                字符串                                   x == toNumber(y)
布爾值                             任何類型                               toNumber(x) == y
字符串或數(shù)字                    對象                                    x == toPrimitive(y)

面向?qū)ο?/h4>
創(chuàng)建普通對象有兩種方式:
1、var obj = new Object();
2歌殃、var obj = {};
創(chuàng)建完成對象:
obj = {
    name:{
          first:'Gandalf'
      }
}
在OOP中乔妈,對象是類的實(shí)例。一個(gè)類定義了對象的特征氓皱。我們會(huì)創(chuàng)建很多類來表示算法和數(shù)據(jù)結(jié)構(gòu)。
function Book(title, pages, isbn){
    this.title = title;
    this.pages = pages;
    this.isbn = isbn;
}
實(shí)例化這個(gè)類:
var book = new Book('title','pag','isbn');
修改對象的屬性:
book.title = 'new title';
原型里聲明和使用函數(shù):
Book.prototype.printTitle = function(){
    console.log(this.title);
};
直接在類的定義里聲明函數(shù):
function Book(title, pages, isbn){
    this.title = title;
    this.pages = pages;
    this.isbn = isbn;
    this.printIsbn = function(){
        console.log(this.isbn);
    }
};
在原型的例子里波材,printTitle方法只會(huì)創(chuàng)建一次股淡,在Book類的所有實(shí)例中共享。如果在定義類的內(nèi)部結(jié)構(gòu)時(shí)聲明廷区,每個(gè)類的實(shí)例都會(huì)有一份該方法的副本唯灵。最好在聲明公共方法時(shí)使用基于原型的方法。

數(shù)組

創(chuàng)建斐波那契數(shù)列隙轻,第一個(gè)數(shù)字是1,第二個(gè)是2,第三項(xiàng)開始闹获,每一項(xiàng)等于前兩項(xiàng)之和:
var fibonacci = [];
fibonacci[0] = 1;
fibonacci[1] = 2;
for(var i = 2; i<20;i++){
    fibonacci[i] = fibonnacci[i-1] + fibonnacci[i-2];
}
數(shù)組方法:
1学赛、array.push:往數(shù)組末尾添加任意元素
2、array.unshift:往數(shù)組首位添加任意元素
3斑匪、array.pop:刪除數(shù)組最后一位元素呐籽,并返回這個(gè)元素
4、array.shift:刪除數(shù)組第一位元素蚀瘸,并返回這個(gè)元素
5狡蝶、array.splice:往數(shù)組任意位置刪除或添加任意元素  
    PS: --array.splice(1,3)--- 在數(shù)組第二位刪除3項(xiàng)元素,并以數(shù)組形式返回被刪除元           素;
      --array.splice(1,0,2,3,4)---往數(shù)組的第二位添加2,3,4三項(xiàng)元素,若刪除元素為 0贮勃,則返回空數(shù)組;
6贪惹、array.concat:連接2個(gè)或更多數(shù)組,并返回結(jié)果寂嘉;
7奏瞬、array.every:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),直到返回false垫释,如果每一項(xiàng)都返回true丝格,則返回true;
    PS:--array.every(function(x){
          return  (x % 2 == 0)
    })    --------返回true 或者 false
8棵譬、array.some:該方法和every方法類似显蝌,對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果任一項(xiàng)返回true订咸,則返回true曼尊;
    PS:--array.some(function(x){
          return  (x % 2 == 0)
    })    --------返回true 或者 false
9、array.forEach:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)脏嚷,該方法沒有返回值骆撇;
10、array.map:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)父叙,返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組神郊;
    PS:--var a = [1,2,3,4,5];
     a.map(function(x){
          return x +1 
    })   ----------返回?cái)?shù)組[2,3,4,5,6],注:a數(shù)組不變肴裙;
11、array.filter:對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)涌乳,返回該函數(shù)會(huì)返回true的項(xiàng)組成的數(shù)組蜻懦;
     PS:--var a =[1,2,3,4,5];
      a.filter(function(x){
            return (x % 2 == 0);
      })   --------返回?cái)?shù)組[2,4],a數(shù)組不變
12、array.reduce:該方法可接收一個(gè)函數(shù)作為參數(shù)和一個(gè)初始值夕晓,第一次調(diào)用函數(shù)會(huì)將初始值作為參數(shù)而非數(shù)組值宛乃,這個(gè)函數(shù)有四個(gè)參數(shù):  previousValue、currentValue蒸辆、index和array征炼。這個(gè)函數(shù)會(huì)返回一個(gè)將被疊加到累加器的值,reduce方法停止執(zhí)行后會(huì)返回這個(gè)累加器躬贡。如果要對一個(gè)數(shù)組中的所有元素求和谆奥,這就很有用;
      PS:--function process(previousArray,currentValue){
                      var nextArray;
                      if(currentValue >= 1 && currentValue <= 10){
                            nextArray = previousArray.push(currentValue);
                     }else{
                            nextArray = previousArray
                    }
                    return nextArray;
              }
              var numbers = [20,1,-4,6,30,5,8],emptyArray = [];
              numbers .reduce(process,emptyArray);--------返回?cái)?shù)組[1,6,5,8]
13、array.reverse:反序排列數(shù)組逗宜,原先數(shù)組最后一位元素變成第一位雄右;
14、array.sort:按照字母順序?qū)?shù)組進(jìn)行排列纺讲,支持傳入指定排序方法的函數(shù)作為參數(shù)
       PS: ----var numbers = [2,3,5,7,1,6,8];
            numbers.sort(function(a,b){
                  return a-b
            })-----返回numbers數(shù)組[1,2,3,5,6,7,8],a-b為升序排列擂仍,b-a為降序排列;若 a 小于 b熬甚,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前逢渔,則返回一個(gè)小于 0 的值,做升序排列。
15乡括、array.indexOf:返回與參數(shù)匹配的第一個(gè)元素的索引肃廓,若參數(shù)不在數(shù)組里則返回-1;
16诲泌、array.lastIndexOf:返回與參數(shù)匹配的最后一個(gè)元素的索引盲赊。
17、array.toString:把數(shù)組里的所有元素輸出為一個(gè)字符串敷扫;
       PS:---var numbers = [1,2,3,4,5];
                 numbers.toString() ----- 返回字符串'1,2,3,4,5',不改變原數(shù)組哀蘑;
18、array.join:把數(shù)組里的所有元素用參數(shù)拼接葵第;
       PS:---var numbers = [1,2,3,4,5];
                   numbers.join('-')  ---- 返回'1-2-3-4-5',不改變原數(shù)組绘迁;
推薦資源:
      1、http://www.w3schools.com/js/js_arrays.asp;
      2卒密、http://www.w3schools.com/js/js_array_methods.asp缀台;
      3、Mozilla的數(shù)組及其方法的頁面
      4哮奇、數(shù)組庫:Underscore:  http://underscorejs.org/      Lo-Dash:  http://lodash.com/

棧是一種遵從后進(jìn)先出原則的有序集合膛腐。新添加的或待刪除的元素都保存在棧的末尾睛约,稱作棧頂,另一端就叫棧底依疼。在棧里痰腮,新元素都靠近棧頂而芥,就元素都接近棧底律罢。

棧的創(chuàng)建
我們創(chuàng)建一個(gè)類來表示棧:
function Stack(){};
首先,我們需要一種數(shù)據(jù)結(jié)構(gòu)來保存棧里的元素棍丐∥蠹可以選擇數(shù)組:
var items = [];
接下來,要為我們的棧聲明一些方法:
1歌逢、push(element(s)):添加一個(gè)(或幾個(gè))新元素到棧頂巾钉。
2、pop():移除棧頂?shù)脑孛匕福瑫r(shí)返回被移除的元素砰苍。
3、peek():返回棧頂?shù)脑刳甯撸粚W鋈魏涡薷模ㄟ@個(gè)方法不會(huì)移除棧頂?shù)脑刈迹瑑H僅返回它)。
4赤惊、isEmpty():如果棧里沒有任何元素就返回true吼旧,否則返回false。
5未舟、clear():移除棧里的所有元素圈暗。
6、size():返回棧里的元素個(gè)數(shù)裕膀。這個(gè)方法和數(shù)組的length屬性很類似员串。

首先,我們要實(shí)現(xiàn)的第一個(gè)方法是push昼扛。這個(gè)方法往棧里添加新元素寸齐,只添加元素到棧頂,也就是棧的末尾野揪。
this.push = function(element){
      items.push(element);
};
因?yàn)槲覀兪褂昧藬?shù)組來保存棧里的元素访忿,所以我們可以使用數(shù)組里的push方法來實(shí)現(xiàn)。

接著斯稳,我們實(shí)現(xiàn)第二個(gè)方法pop海铆。這個(gè)方法主要用來移除棧里的元素。棧遵循后進(jìn)先出的原則挣惰,因此移除的是最后添加進(jìn)去的元素,所以我們可以使用數(shù)組里的pop方法來實(shí)現(xiàn)卧斟。 
this.pop = function(){
    return items.pop();
}
只能用push和pop方法添加和刪除棧中元素殴边,這樣一來,我們的棧自然就遵從了lifo原則珍语。

現(xiàn)在锤岸,為我們的類實(shí)現(xiàn)一些額外的輔助方法。如果想知道棧里面最后添加的元素是什么板乙,可以用peek方法是偷。
this.peek = function(){
    return items[items.length-1];
}

接著要實(shí)現(xiàn)的方法是isEmpty,如果棧為空的話就返回true,否則就返回false募逞;
this.isEmpty = function(){
    return items.length == 0;
}

類似于數(shù)組的length屬性蛋铆,我們也能實(shí)現(xiàn)棧的長度方法size;
this.size = function(){
    return items.length;
}

最后放接,我們來實(shí)現(xiàn)clear方法刺啦,用來移除棧里所有的元素。
this.clear = function(){
    items = [];
}
這樣棧就實(shí)現(xiàn)了纠脾,為了檢查棧里的內(nèi)容玛瘸,我們來實(shí)現(xiàn)一個(gè)輔助方法,叫print苟蹈,它會(huì)把棧里的元素都輸出到控制臺(tái)糊渊。
this.print = function(){
    console.log(items.toString());
}
這樣,我們就完整創(chuàng)建了棧汉操!
使用棧
現(xiàn)在我們就來實(shí)現(xiàn)一個(gè)十進(jìn)制轉(zhuǎn)化成二進(jìn)制的過程:
function divideBy2(decNumber){
    var remStack = new Stack(),rem,binaryString = '';
    while(decNumber >0){
        rem = Math.floor(decNumber % 2);
        remStack.push(rem);
        decNumber = Math.floor(decNumber / 2)
    }
    
    while(!remStack.isEmpty()){
        binaryString += remStack.pop().toString();
    }
    
    return binaryString;
}

這樣再来,我們修改下上面的算法,就能把十進(jìn)制轉(zhuǎn)換成任何進(jìn)制磷瘤。
function baseConverter(decNumber,base){
    var remStack = new Stack(),rem,baseString='',digits='0123456789ABCDEF';
    while(decNumber >0){
         rem = Math.floor(decNumber % base);
         remStack.push(rem);
         decNumber = Math.floor(decNumber / base);
    }

    while(!remStack.isEmpty()){
        baseString += digits[remStack.pop()];
    }
    return baseString;
}

隊(duì)列

隊(duì)列和棧非常類似芒篷,但是使用了不同的原則,其是遵從先進(jìn)先出原則的一組有序的項(xiàng)采缚。隊(duì)列在尾部添加新元素针炉,并從頂部移除元素,最新添加的元素必須排在隊(duì)列的末尾扳抽。

隊(duì)列的創(chuàng)建
我們創(chuàng)建一個(gè)類來表示隊(duì)列:
function Queue(){};
首先篡帕,我們需要一個(gè)用于存儲(chǔ)隊(duì)列中元素的數(shù)據(jù)結(jié)構(gòu)。我們可以使用數(shù)組贸呢,就像在上一章Stack類中那樣使用:
var items = [];
接下來镰烧,我們聲明一些隊(duì)列可用的方法:
1、enqueue(element(s)):向隊(duì)列尾部添加一個(gè)(或多個(gè))新的項(xiàng)楞陷。
2怔鳖、dequeue():移除隊(duì)列的第一項(xiàng),并返回被移除的元素固蛾。
3结执、front():返回隊(duì)列中第一個(gè)元素----最先被添加度陆,也將是最先被移除的元素,隊(duì)列不做任何變動(dòng)献幔。
4懂傀、isEmpty():如果隊(duì)列中不包含任何元素,返回true蜡感,否則返回false蹬蚁。
5、clear():移除隊(duì)列里的所有算數(shù)铸敏。
6缚忧、size():返回隊(duì)列包含的元素個(gè)數(shù),與數(shù)組的length屬性類似杈笔。

首先要實(shí)現(xiàn)的是enqueue方法,這個(gè)方法往隊(duì)列里添加新元素糕非,只添加到隊(duì)列末尾:
this.enqueue = function(element){
    items.push(element);
}
接下來要實(shí)現(xiàn)的是dequeue方法蒙具,這個(gè)方法刪除隊(duì)列里的第一項(xiàng):
this.dequeue = function(){
    return items.shift();
}
只有enqueue方法和dequeue方法可以添加和移除元素,這樣就確保了Queue類遵從先進(jìn)先出原則朽肥。

現(xiàn)在禁筏,為我們的類實(shí)現(xiàn)一些額外的輔助方法,如果想知道隊(duì)列最前面的項(xiàng)是什么衡招,可以用front方法:
this.front = function(){
    return items[0]
}

接著要實(shí)現(xiàn)isEmpty方法篱昔,如果隊(duì)列為空返回true,否則就返回false始腾。
this.isEmpty = function(){
    return items.length == 0;
}

接著是size方法州刽,來獲取隊(duì)列的長度。
this.size = function(){
    return items.length;
}

最后來實(shí)現(xiàn)clear方法浪箭。
this.clear = function(){
    items = [];
}
這樣隊(duì)列就實(shí)現(xiàn)了穗椅,也可以像Stack類一樣增加一個(gè)print方法:
this.print = function(){
    console.log(items.toString());
}
這樣,我們就實(shí)現(xiàn)了一個(gè)隊(duì)列奶栖!
優(yōu)先隊(duì)列

優(yōu)先隊(duì)列中匹表,元素的添加和移除是基于優(yōu)先級(jí)的。一個(gè)現(xiàn)實(shí)的例子就是醫(yī)院的急診宣鄙,要實(shí)現(xiàn)優(yōu)先隊(duì)列袍镀,有兩種選項(xiàng):設(shè)置優(yōu)先級(jí),然后在正確的位置添加元素冻晤;或者用入列操作添加元素苇羡,然后按照優(yōu)先級(jí)移除它們。

我們創(chuàng)建一個(gè)類來表示優(yōu)先隊(duì)列:
function PriorityQueue(){
   var items = [];
   //創(chuàng)建一個(gè)隊(duì)列元素類,在接下來的添加元素方法中會(huì)使用到
   function QueueElement(element,priority){
       this.element = element;
       this.priority = priority;
   }
};

接下來我們實(shí)現(xiàn)enqueue方法明也,在隊(duì)列的正確位置添加元素宣虾。
this.enqueue = function(element,priority){
    var queueElement = new QueueElement(element,priority);
    if(this.isEmpty()){//this指向該優(yōu)先隊(duì)列惯裕,這里直接調(diào)用判斷隊(duì)列是否為空的方法
        items.push(queueElement);
    }else{
          var added = false;
          for (var i; i<items.length;i++){
               if(queueElement.priority < items[i].priority){
                      items.splice(i,0,queueElement);
                      added = true;
                      break;
               }
          }
          if(!added){
               items.push(queueElement);
          }
    }
}

這樣就完成按照優(yōu)先級(jí)在正確的位置添加元素了,優(yōu)先隊(duì)列里的元素都有優(yōu)先級(jí)該屬性绣硝,通過優(yōu)先級(jí)的判斷然后在正確的位置添加元素蜻势。我們這里實(shí)現(xiàn)的優(yōu)先隊(duì)列稱為最小優(yōu)先隊(duì)列因?yàn)閮?yōu)先級(jí)的值較小的元素被放置在隊(duì)列最前面(1代表更高的優(yōu)先級(jí))。最大優(yōu)先隊(duì)列與之相反鹉胖,把優(yōu)先級(jí)的值較大的元素放置在隊(duì)列最前面握玛。
循環(huán)隊(duì)列

循環(huán)隊(duì)列的一個(gè)例子就是擊鼓傳花游戲,在這個(gè)游戲里甫菠,孩子們圍成一個(gè)圈挠铲,把花盡快的傳遞給旁邊的人。某一時(shí)刻花停止寂诱,這個(gè)時(shí)候花在誰手里拂苹,誰就退出圓圈結(jié)束游戲。重復(fù)這個(gè)過程痰洒,直到只剩一個(gè)孩子(勝者)瓢棒。

下面,我們實(shí)現(xiàn)一個(gè)模擬的擊鼓傳花游戲:
function  hotPotato (nameList,num){
    var queue = newQueue();
    for(var i=0;i<nameList.length;i++){
        queue.enqueue(nameList[i]);
    }
    var eliminated = ' ';//被淘汰的對象
    while(queue.size() >1){
        for(var i=0;i<num;i++){
            queue.enqueue(queue.dequeue());
        }
        eliminated = queue.dequeue();//當(dāng)i等于給定的數(shù)字num時(shí)丘喻,被淘汰的元素
    }
    return queue.dequeue();//最后剩下一個(gè)為勝利者
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脯宿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泉粉,更是在濱河造成了極大的恐慌连霉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗡靡,死亡現(xiàn)場離奇詭異跺撼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叽躯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門财边,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人点骑,你說我怎么就攤上這事酣难。” “怎么了黑滴?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵憨募,是天一觀的道長。 經(jīng)常有香客問我袁辈,道長菜谣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮尾膊,結(jié)果婚禮上媳危,老公的妹妹穿的比我還像新娘。我一直安慰自己冈敛,他們只是感情好待笑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抓谴,像睡著了一般暮蹂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上癌压,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天仰泻,我揣著相機(jī)與錄音,去河邊找鬼滩届。 笑死集侯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丐吓。 我是一名探鬼主播浅悉,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼券犁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汹碱,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對情侶失蹤粘衬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咳促,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稚新,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年跪腹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褂删。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冲茸,死狀恐怖屯阀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轴术,我是刑警寧澤难衰,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站逗栽,受9級(jí)特大地震影響盖袭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一鳄虱、第九天 我趴在偏房一處隱蔽的房頂上張望弟塞。 院中可真熱鬧,春花似錦拙已、人聲如沸决记。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霉涨。三九已至,卻和暖如春惭适,著一層夾襖步出監(jiān)牢的瞬間笙瑟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工癞志, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留往枷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓凄杯,卻偏偏與公主長得像错洁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子戒突,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容