<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    E81086713E446D36F62B2AA2A3502B5EB155

    Java雜家

    雜七雜八。。。一家之言

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      40 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks




    今天去網上看了一下09年的考研試題,看見該題目(圖片):



    先來定義結點(為了簡便,省略set/get):
    public class Node
    {
     
    public int data;
     
    public Node link;
    }
    我能想到的兩種解法,一個基于遞歸:

    遞歸版的思路就是,基于當前結點,如果后一個是倒數第K-1,那么當前結點是所求,若不然,返回當前是倒數第幾個。
    public int printRKWithRecur(Node head,int k)
        {
            
    if(k==0||head==null||head.link==null)return 0;
            
    if(_recurFind(head.link,k)>=k)return 1;
            
    return 0;
        }
        
    private final int _recurFind(Node node, int k) {
            
    if(node.link==null)
            {
                
    return 1;
            }
            
    int sRet=_recurFind(node.link,k);
            
    if(sRet==k-1)
            {
                System.out.println(
    "Got:"+node.data);
                
    return k;
            }
            
    return sRet+1;
        }


    對每個結點,該算法都只訪問一次,因此復雜度O(N).

    第二解法,相對遞歸來說,這種方法可以算是消除遞歸版,而且從某種意義上來說比遞歸更高效,跟省空間,遞歸版實際上是把回溯的數據存在棧上,而版方法是自己存儲,且利用數組實現一個循環隊列,只存儲K個元素。

    public static class CycleIntQueue
        {
            
    int[] datas;
            
    int top=0;
            
    int num=0;
            
    public CycleIntQueue(int n)
            {
                datas
    =new int[n];
            }
            
            
    public void push(int i)
            {
                datas[(top
    ++)%datas.length]=i;
                num
    ++;
                
            }
            
    public int numPushed()
            {
                
    return num;
            }
            
            
            
    public int getButtom()
            {
                
    return datas[top%datas.length];
            }
        }
        
    public int printRKWithCycleQueue(Node head,int k)
        {
            
    if(k==0||head==null)return 0;
            CycleIntQueue queue
    =new CycleIntQueue(k);
            Node cur
    =head.link;
            
    while(cur!=null)
            {
                queue.push(cur.data);
                cur
    =cur.link;
            }
            
    if(queue.numPushed()<k)return 0;
            
            System.out.println(
    "Got:"+queue.getButtom());
            
    return 1;
        }

    本算法,都每個結點也只放一次,另外進行一次入隊操作,該操作復雜度O(1),從而,整個算法復雜度仍是O(N).


    posted on 2009-01-17 13:56 DoubleH 閱讀(2286) 評論(5)  編輯  收藏

    Feedback

    # re: [算法]09考研數據結構試題解法 2009-01-17 15:41 crtylr
    個人覺得根本就用不著那么,麻煩的方法
    兩個指針,第一個指向頭,另一個指向從頭開始的指向第K個
    然后兩個指針分別指向Next,
    直到第二個指針指向了Null,那第一個指針的元素就是所求的倒數第K個  回復  更多評論
      

    # re: [算法]09考研數據結構試題解法 2009-01-17 20:53 銀河使者
    這是一個算法,詳細解釋見我的blog:
    http://www.tkk7.com/nokiaguy/archive/2009/01/17/251722.html

        private static int findNode(Node headNode, int k)
        {
            Node p = headNode, p1 = headNode, p2 = null;
            int count = 0;  //  表示結點數
            while (p.nextNode != null)
            {
                p = p.nextNode;
                count++;
                //  遇到k的整數位個結點,進行分塊
                if (count % k == 0)
                {                
                    if (p2 != null)
                        p1 = p2;
                    p2 = p;
                }
            }
            //  k超過鏈表結點數,未找到,返回0
            if (p2 == null)
            {
                return 0;
            }
            else
            {
                int mod = count % k;
                int offset = mod + 1;  // 任何情況下,最終結果都是p1指向的結點向后移動(mod + 1)個結點
                for (int i = 0; i < offset; i++)
                    p1 = p1.nextNode;
                System.out.println(p1.data);
                return 1;
            }
        }

      回復  更多評論
      

    # re: [算法]09考研數據結構試題解法 2009-01-17 22:48 DoubleH
    @crtylr
    @銀河使者
    恩,二位的想法其實是一樣的,銀河使者其實就是crtylr的復雜版。crtylr的意思應該是對頭K個元素,只移動一個指針,然后一起移動直到第一個指針沒法繼續。  回復  更多評論
      

    # re: [算法]09考研數據結構試題解法 2009-01-18 10:39 銀河使者
    是的,@crtylr的算法比較好,下面的具體的實現代碼,很簡單:
        private static int findNode(Node headNode, int k)
        {       
            Node p1 = headNode, p2 = headNode;
            for(int i = 0; i < k && p2.nextNode != null; i++)
                p2 = p2.nextNode;
            if(p2.nextNode == null) return 0;
            while(p2.nextNode != null)
            {
                p1 = p1.nextNode;
                p2 = p2.nextNode;
            }
            System.out.println(p1.nextNode.data);
            return 1;
        }   回復  更多評論
      

    # re: [算法]09考研數據結構試題解法[未登錄] 2009-01-20 19:14 hehe
    這道題目好熟悉阿.. 呵呵
      回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲无码在线播放| 久久精品国产亚洲5555| 亚洲国产精品美女| 69pao强力打造免费高清| 亚洲天堂在线播放| 一区二区三区在线免费看| 久久久久久a亚洲欧洲AV| 久久一本岛在免费线观看2020| 亚洲AV综合色一区二区三区| 久9热免费精品视频在线观看| 久久久无码精品亚洲日韩京东传媒| 久久青草免费91线频观看不卡| 亚洲最大的成网4438| 1000部拍拍拍18免费网站| 亚洲免费电影网站| 黄a大片av永久免费| 老司机午夜在线视频免费观| 亚洲免费一区二区| 久久综合九色综合97免费下载 | 两性刺激生活片免费视频| 亚洲香蕉久久一区二区三区四区| 性感美女视频免费网站午夜| 国产成人综合亚洲| 亚洲成av人影院| 欧美最猛性xxxxx免费| 亚洲国产成人AV网站| 亚洲色欲久久久久综合网| 久久久久久久99精品免费观看| 亚洲自偷自拍另类图片二区| 性盈盈影院免费视频观看在线一区| 三年片在线观看免费观看大全中国| 亚洲熟妇中文字幕五十中出| 精品久久久久久久久免费影院| 国产精品无码亚洲精品2021| 亚洲人成亚洲人成在线观看| 免费三级毛片电影片| 手机永久免费的AV在线电影网| 亚洲一区二区三区日本久久九| 日韩高清免费在线观看| 精品免费tv久久久久久久 | 四虎精品免费永久免费视频|