面試算法知識梳理(14) - 數(shù)字算法

面試算法代碼知識梳理系列

面試算法知識梳理(1) - 排序算法
面試算法知識梳理(2) - 字符串算法第一部分
面試算法知識梳理(3) - 字符串算法第二部分
面試算法知識梳理(4) - 數(shù)組第一部分
面試算法知識梳理(5) - 數(shù)組第二部分
面試算法知識梳理(6) - 數(shù)組第三部分
面試算法知識梳理(7) - 數(shù)組第四部分
面試算法知識梳理(8) - 二分查找算法及其變型
面試算法知識梳理(9) - 鏈表算法第一部分
面試算法知識梳理(10) - 二叉查找樹
面試算法知識梳理(11) - 二叉樹算法第一部分
面試算法知識梳理(12) - 二叉樹算法第二部分
面試算法知識梳理(13) - 二叉樹算法第三部分


一栖榨、目錄

  • 斐波那契數(shù)列(循環(huán)算法昆汹、矩陣算法)
  • 跳臺階問題
  • 數(shù)值的整數(shù)次方
  • 打印1到最大的n位數(shù)
  • 計(jì)算從1n1出現(xiàn)的個(gè)數(shù)
  • 求兩個(gè)數(shù)的二進(jìn)制表示中有多少個(gè)是不同的
  • 給定一個(gè)整數(shù)N,求N!的末尾有多少個(gè)0
  • 給定一個(gè)整數(shù)N婴栽,求N!的二進(jìn)制表示中最低位1的位置
  • 最大公約數(shù)
  • 精確地表達(dá)有限/無限循環(huán)小數(shù)

二满粗、代碼實(shí)現(xiàn)

2.1 斐波那契數(shù)列(循環(huán)算法、矩陣算法)

問題描述

斐波那契數(shù)列 滿足下面的通項(xiàng)公式愚争,要求給出N映皆,輸出第N項(xiàng)的F(N)

F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

解決思路

這里介紹兩種解決辦法轰枝,循環(huán)算法矩陣算法捅彻。循環(huán)算法比較容易理解,就是從F(0)開始鞍陨,根據(jù)通項(xiàng)公式步淹,得到下一個(gè)斐波那契數(shù)列中的數(shù)字即可。

循環(huán)算法代碼實(shí)現(xiàn)

class Untitled {
    
    static double fibonacci(int n) {
        if (n < 2) {
            return n;
        }
        //f(n-2)
        double fnMinus2 = 0;
        //f(n-1)
        double fnMinus1 = 1;
        double result = 0;
        for (int i=2; i<=n; i++) {
            //根據(jù)通項(xiàng)公式計(jì)算湾戳。
            result = fnMinus2 + fnMinus1;
            fnMinus2 = fnMinus1;
            fnMinus1 = result;
        }
        return result;
    }
    
    public static void main(String[] args) {
        double loopResult = fibonacci(10);
        System.out.println("loopResult=" + loopResult);
    }
}

循環(huán)算法運(yùn)行結(jié)果

>> loopResult=55.0

矩陣算法解決思路

對于上面的通項(xiàng)公式贤旷,可以用下面的矩陣乘法的形式來表示


那么,我們的問題就變成了求該特殊矩陣的N-1次方的值砾脑。

矩陣算法代碼實(shí)現(xiàn)

class Untitled {
    
    static class Matrix {
        
        double a;
        double b;
        double c;
        double d;
        
        public Matrix(double a, double b, double c, double d) {
            this.a = a;
            this.b = b;
            this.c = c;
            this.d = d;
        }
    }
    
    //矩陣乘法函數(shù)幼驶。
    static Matrix multiMatrix(Matrix a, Matrix b) {
        Matrix result = new Matrix(0, 0, 0, 0);
        result.a = a.a*b.a + a.b*b.c;
        result.b = a.a*b.b + a.b*b.d;
        result.c = a.c*b.a + a.d*b.c;
        result.d = a.c*b.b + a.d*b.d;
        return result;
    }
    
    //核心函數(shù)。
    static double fibonacciMatrix(int n) {
        if (n < 2) {
            return n;
        }
        Matrix r = new Matrix(1, 0, 0, 1);
        Matrix tmp = new Matrix(1, 1, 1, 0);
        n--;
        while (n > 0) {
            if ((n&1) > 0) {
                r = multiMatrix(r, tmp);
            }
            tmp = multiMatrix(tmp, tmp);
            n >>= 1;
        }
        return r.a;
    }
    
    public static void main(String[] args) {
        double matrixResult = fibonacciMatrix(10);
        System.out.println("matrixResult=" + matrixResult);
    }
}

矩陣算法運(yùn)行結(jié)果

>> matrixResult=55.0

2.2 跳臺階問題

問題描述

一個(gè)臺階總共有n級韧衣,如果一次可以跳1級盅藻,也可以跳2級,求總共有多少總跳法畅铭。

解決思路

由于有兩種跳臺階方式氏淑,因此跳n級臺階可以轉(zhuǎn)換為下面兩個(gè)問題之和:

  • 第一次跳1級臺階,之后的解法數(shù)為f(n-1)
  • 第一次跳2級臺階硕噩,之后的解法數(shù)為f(n-2)

這就和之前的斐波那契數(shù)列的通項(xiàng)公式相同假残。

實(shí)現(xiàn)代碼

class Untitled {

    static class Matrix {

        double a;
        double b;
        double c;
        double d;

        public Matrix(double a, double b, double c, double d) {
            this.a = a;
            this.b = b;
            this.c = c;
            this.d = d;
        }
    }

    //矩陣乘法函數(shù)。
    static Matrix multiMatrix(Matrix a, Matrix b) {
        Matrix result = new Matrix(0, 0, 0, 0);
        result.a = a.a*b.a + a.b*b.c;
        result.b = a.a*b.b + a.b*b.d;
        result.c = a.c*b.a + a.d*b.c;
        result.d = a.c*b.b + a.d*b.d;
        return result;
    }

    //核心函數(shù)炉擅。
    static double fibonacciMatrix(int n) {
        if (n < 2) {
            return n;
        }
        Matrix r = new Matrix(1, 0, 0, 1);
        Matrix tmp = new Matrix(1, 1, 1, 0);
        n--;
        while (n > 0) {
            if ((n&1) > 0) {
                r = multiMatrix(r, tmp);
            }
            tmp = multiMatrix(tmp, tmp);
            n >>= 1;
        }
        return r.a;
    }

    static double stepCounter(int step) {
        if (step <= 2) {
            return step;
        }
        return fibonacciMatrix(step);
    }


    public static void main(String[] args) {
        double count = stepCounter(50);
        System.out.println("counter=" + count);
    }
}

2.3 數(shù)值整數(shù)次方

實(shí)現(xiàn)代碼

class Untitled {

    static double powerOfNum(int num, int power) {
        int tmp = num;
        int r = 1;
        while (power > 0) {
            //如果在該位上為1辉懒,那么就乘上對應(yīng)的n次方。
            if ((power&1) > 0) {
                r = r*tmp;
            }
            tmp = tmp*tmp;
            power >>= 1;
        }
        return r;
    }


    public static void main(String[] args) {
        System.out.println("powerOfNum=" + powerOfNum(2, 10));
    }
}

運(yùn)行結(jié)果

>> powerOfNum=1024.0

2.4 打印 1 到最大的 n 位數(shù)

class Untitled {

    static void printNumberCore(int p[], int depth, int len) {
        //到達(dá)末尾谍失,打印當(dāng)前數(shù)組中的元素眶俩。
        if (depth == len+1) {
            StringBuilder builder = new StringBuilder();
            for (int i=1; i<=len; i++) {
                builder.append(String.valueOf(p[i]));
            }
            System.out.println(builder.toString());
            return;
        }
        //如果是首位,那么從1開始快鱼,否則從0開始颠印。
        int pStart = 0;
        if (depth == 1) {
            pStart = 1;
        }
        for (int i=pStart; i<=9; i++) {
            //替換該位纲岭,并進(jìn)行遞歸。
            p[depth] = i;
            printNumberCore(p, depth+1, len);
        }
    }

    static void printNumber(int n) {
        //首先建立數(shù)組线罕。
        int p[] = new int[n+1];
        //len表示有幾位數(shù)止潮。
        for (int len=1; len<=n; len++) {
            //對應(yīng)于len位數(shù)的全排列。
            printNumberCore(p, 1, len);
        }
    }

    public static void main(String[] args) {
        printNumber(3);
    }
}

2.5 計(jì)算從 1 到 n 中 1 出現(xiàn)的個(gè)數(shù)

解決思路

這個(gè)問題钞楼,需要先總結(jié)一下規(guī)律沽翔,我們根據(jù)數(shù)字N位數(shù) 來進(jìn)行分析:

一位數(shù)

那么N>=1時(shí)才會(huì)出現(xiàn)1,并且出現(xiàn)1的次數(shù)為1

兩位數(shù)

在這種情況下窿凤,出現(xiàn)1的次數(shù)等于個(gè)位上出現(xiàn)1的次數(shù)加上十位上出現(xiàn)1的個(gè)數(shù)。

  • 個(gè)位上出現(xiàn)1的次數(shù)不僅和個(gè)位的數(shù)字有關(guān)跨蟹,還和十位的數(shù)字有關(guān):

    • 如果個(gè)位為0雳殊,那么個(gè)位上出現(xiàn)1的次數(shù)等于十位的數(shù)字。
    • 如果個(gè)位大于0窗轩,那么個(gè)位上出現(xiàn)1的次數(shù)等于十位的數(shù)字加1夯秃。
  • 十位上出現(xiàn)1的次數(shù)不僅和十位的數(shù)字有關(guān),還和個(gè)位的數(shù)字有關(guān):

    • 如果十位為1痢艺,那么十位上出現(xiàn)1的次數(shù)等于個(gè)位的數(shù)字加1仓洼。
    • 如果十位大于1,那么十位上出現(xiàn)1的次數(shù)等于10堤舒。

N 位數(shù)

例如色建,如果要計(jì)算百位上1出現(xiàn)的次數(shù),它要受到三方面的影響:百位上的數(shù)字舌缤,百位以下的數(shù)字箕戳,百位以上的數(shù)字。

  • 如果百位上數(shù)字為0国撵,百位上可能出現(xiàn)1的次數(shù)僅由更高位決定陵吸,等于更高位數(shù)字乘以當(dāng)前位數(shù)。

  • 如果百位上數(shù)字為1介牙,百位上可能出現(xiàn)1的次數(shù)不僅受更高位影響還受低位影響:

    • 受高位影響的部分等于更高位數(shù)字乘以當(dāng)前位數(shù)
    • 受低位影響等于低位數(shù)字加上1壮虫。
  • 如果百位上數(shù)字大于1,則百位上出現(xiàn)1的情況僅由更高位決定环础,等于更高位數(shù)字加上1乘以當(dāng)前位數(shù)囚似。

代碼實(shí)現(xiàn)

class Untitled {

    static int countOneNum(int data) {
        int iFac = 1;
        int countNum = 0;
        int lowNum = 0;
        int curNum = data % 10;
        int highNum = data / 10;
        //從個(gè)位數(shù)開始遍歷,每次while循環(huán)向前移動(dòng)一位喳整,計(jì)算每一位出現(xiàn)1的次數(shù)谆构,總和就是問題的解。
        while (curNum > 0 || highNum > 0) {
            if (curNum == 0) {
                countNum += highNum * iFac;
            } else if   (curNum == 1) {
                countNum += highNum * iFac + (lowNum + 1);
            } else {
                countNum += (highNum+1)*iFac;

            }
            lowNum = lowNum + curNum*iFac;
            curNum = highNum % 10;
            highNum = highNum / 10;
            iFac *= 10;
        }
        return countNum;
    }


    public static void main(String[] args) {
        System.out.println("n=" + 123 + ",result=" + countOneNum(123));
    }
}

運(yùn)行結(jié)果

>> n=123,result=57

2.6 求兩個(gè)數(shù)的二進(jìn)制表示中有多少個(gè)是不同的

解決思路

對于一個(gè)二進(jìn)制數(shù)框都,例如1010搬素,將其減1后得到的結(jié)果是1001呵晨,也就是將最后一個(gè)1(倒數(shù)第二位)及其之后的0變成11變成0熬尺,再將該結(jié)果與原二進(jìn)制數(shù)相與摸屠,也就是1010 & 1001 = 1000,那么就可以去掉最后一個(gè)1粱哼。

因此季二,如果需要計(jì)算兩個(gè)數(shù)的二進(jìn)制表示中有多少位是不同的,可以 先將這兩個(gè)數(shù)異或揭措,那么不相同的位數(shù)就會(huì)變成1胯舷,之后利用上面的技巧,通過每次去掉最后一個(gè)1绊含,來 統(tǒng)計(jì)該結(jié)果中1的個(gè)數(shù)桑嘶,就可以知道兩個(gè)數(shù)的二進(jìn)制表示中有多少是不同的了。

代碼實(shí)現(xiàn)

class Untitled {

    static int getDiffBit(int a, int b) {
        int diff = a^b;
        int count = 0;
        while (diff > 0) {
            count++;
            diff = diff & (diff-1);
        }
        return count;
    }


    public static void main(String[] args) {
        System.out.println("result=" + getDiffBit(1999, 2299));
    }
}

運(yùn)行結(jié)果

>> result=7

2.7 給定一個(gè)整數(shù) N躬充,求 N! 的末尾有多少個(gè) 0

問題描述

N!的含義為1*2*3*...*(N-1)*N逃顶,計(jì)算N!的十進(jìn)制表示中,末尾有多少個(gè)0充甚。

解答思路

N!中能產(chǎn)生末尾是0的質(zhì)數(shù)組合是2*5以政,所以N!末尾的0的個(gè)數(shù)取決了2的個(gè)數(shù)和5的個(gè)數(shù)的最小值,有因?yàn)楸?code>2整除的數(shù)出現(xiàn)的概率大于5伴找,因此5出現(xiàn)的次數(shù)就是N!末尾0的個(gè)數(shù)盈蛮。因此,該問題就轉(zhuǎn)換成為計(jì)算從1~N疆瑰,每個(gè)數(shù)可以貢獻(xiàn)5的個(gè)數(shù)眉反,也就是每個(gè)數(shù)除以5的值。

上面的解法需要從1N遍歷每一個(gè)數(shù)穆役,當(dāng)然還有更加簡便的方法寸五。以26!為例,貢獻(xiàn)5的數(shù)有5耿币、10梳杏、15、20淹接、25十性,一共貢獻(xiàn)了6個(gè)5,可以理解為5的倍數(shù)5塑悼、10劲适、15、20厢蒜、25貢獻(xiàn)了一個(gè)5霞势,而25的倍數(shù)又貢獻(xiàn)了一個(gè)5烹植,得到下面的公式:

Z = [N/5] +[N/5^2] +[N/5^3] + …(總存在一個(gè)K,使得5^K > N愕贡,[N/5^K]=0)

代碼實(shí)現(xiàn)

class Untitled {
    
    static int lowZeroN(int N) {
        int count = 0;
        while (N > 0) {
            N = N / 5;
            count = count + N;
        }
        return count;
    }
    
    public static void main(String[] args) {
        System.out.println("26!的十進(jìn)制表示中末尾0的個(gè)數(shù)=" + lowZeroN(26));
    }
}

運(yùn)行結(jié)果

>> 26!的十進(jìn)制表示中末尾0的個(gè)數(shù)=6

2.8 給定一個(gè)整數(shù) N草雕,求 N! 的二進(jìn)制表示中最低位 1 的位置

解答思路

首先,讓我們換一個(gè)角度考慮固以,其實(shí)這個(gè)問題就是求解二進(jìn)制表示中從最低位開始0的個(gè)數(shù)墩虹,因?yàn)槎M(jìn)制最低位為0代表的是偶數(shù),能夠被2整除憨琳,所以質(zhì)因數(shù)2的個(gè)數(shù)就是二進(jìn)制表示中最低位1后面的0的個(gè)數(shù)诫钓。

因此,我們的實(shí)現(xiàn)這就和上面2.7中求解質(zhì)因數(shù)5的個(gè)數(shù)是一樣的篙螟。

代碼實(shí)現(xiàn)

class Untitled {
    
    static int lowOneN(int N) {
        int count = 0;
        while (N > 0) {
            N = N >> 1;
            count = count + N;
        }
        return count+1;
    }
    
    public static void main(String[] args) {
        System.out.println("3!的二進(jìn)制表示中最低位1的位置=" + lowOneN(3));
    }
}

運(yùn)行結(jié)果

>> 3!的二進(jìn)制表示中最低位1的位置=2

2.9 最大公約數(shù)

問題描述

最大公約數(shù) 的定義為 兩個(gè)或多個(gè)整數(shù)的共有約數(shù)中最大的一個(gè)尖坤。這里采用的是 更相止損法,其操作步驟為:

  • 第一步:任意給定兩個(gè)正整數(shù)闲擦;判斷它們是否都是偶數(shù)。若是场梆,則用2約簡墅冷;若不是則執(zhí)行第二步。
  • 第二步:以較大的數(shù)減較小的數(shù)或油,接著把所得的差與較小的數(shù)比較寞忿,并以大數(shù)減小數(shù)。繼續(xù)這個(gè)操作顶岸,直到所得的減數(shù)和差相等為止腔彰。

則第一步中約掉的若干個(gè)2與第二步中等數(shù)的乘積就是所求的最大公約數(shù)。

代碼實(shí)現(xiàn)

class Untitled {

    static int gcd(int big, int small) {
        int fac = 1;
        int temp;
        while (small > 0) {
            //保證數(shù)字的先后順序辖佣。
            if (small > big) {
                temp = big;
                big = small;
                small = temp;
            }
            if ((big & 1) > 0) {
                //奇奇霹抛。
                if ((small & 1) > 0) {
                    temp = big;
                    big = small;
                    small = temp - small;
                //奇偶。
                } else {
                    small >>= 1;
                }
            } else {
                //偶奇卷谈。
                if ((small & 1) > 0) {
                    big >>= 1;
                //偶偶杯拐。
                } else {
                    small >>= 1;
                    big >>= 1;
                    fac *= 2;
                }
            }
        }
        return big * fac;
    }


    public static void main(String[] args) {
        int result = gcd(319, 377);
        System.out.println("result=" + result);
    }
}

運(yùn)行結(jié)果

>> result=29

2.10 精確地表達(dá)有限/無限循環(huán)小數(shù)

問題描述

有限小數(shù)或者無限循環(huán)小數(shù)都可以轉(zhuǎn)化為分?jǐn)?shù),例如:

有限小數(shù):0.9 = 9/10
無限循環(huán)小數(shù):0.333(3)= 1/3

解決思路

http://blog.csdn.net/flyfish1986/article/details/47783545 這邊文章中世蔗,詳細(xì)地描述了該題的解決思路端逼,核心思想就是將原小數(shù)分為 有限部分無限循環(huán)小數(shù) 部分,對于這兩部分別進(jìn)行處理污淋。

算法核心思想

代碼實(shí)現(xiàn)

class Untitled {

    public static class Fraction {
        //分子顶滩。
        public double numerator;
        //分母。
        public double denominator;
    }

    public static double powerOf(int num, int mi) {
        double temp = 10;
        double result = 1;
        while (mi > 0) {
            if ((mi & 1) > 0) {
                result = result * temp;
            }
            temp = temp * temp;
            mi >>= 1;
        }
        return result;
    }

    //分為有限循環(huán)和無限循環(huán)兩個(gè)部分寸爆,按照公式計(jì)算礁鲁。
    public static Fraction getDescription(int limit, int limitLen, int unLimit, int unLimitLen) {
        //分別計(jì)算對應(yīng)長度的10的n/m次冪盐欺。
        double limitPower = powerOf(10, limitLen);
        double unLimitPower = powerOf(10, unLimitLen);
        Fraction fraction = new Fraction();
        //根據(jù)公式計(jì)算分子和分母即可。
        fraction.numerator = limit * (unLimitPower - 1) + unLimit;
        fraction.denominator = (unLimitPower - 1) * limitPower;
        return fraction;
    }

    public static void main(String[] args) {
        Fraction f = getDescription(285714, 6, 285714, 6);
        System.out.println("res= " + f.numerator + "/" + f.denominator);
    }
}

運(yùn)行結(jié)果

>> res= 2.85714E11/9.99999E11

更多文章救氯,歡迎訪問我的 Android 知識梳理系列:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末找田,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子着憨,更是在濱河造成了極大的恐慌墩衙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甲抖,死亡現(xiàn)場離奇詭異漆改,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)准谚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門挫剑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柱衔,你說我怎么就攤上這事樊破。” “怎么了唆铐?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵哲戚,是天一觀的道長。 經(jīng)常有香客問我艾岂,道長顺少,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任王浴,我火速辦了婚禮脆炎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氓辣。我一直安慰自己秒裕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般硕糊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上入蛆,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音硕勿,去河邊找鬼哨毁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛源武,可吹牛的內(nèi)容都是我干的扼褪。 我是一名探鬼主播想幻,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼话浇!你這毒婦竟也來了脏毯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤幔崖,失蹤者是張志新(化名)和其女友劉穎食店,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赏寇,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吉嫩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗅定。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片自娩。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖渠退,靈堂內(nèi)的尸體忽然破棺而出忙迁,到底是詐尸還是另有隱情,我是刑警寧澤碎乃,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布动漾,位于F島的核電站,受9級特大地震影響荠锭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晨川,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一证九、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧共虑,春花似錦愧怜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尘分,卻和暖如春猜惋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背培愁。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工著摔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人定续。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓谍咆,卻偏偏與公主長得像禾锤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子摹察,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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