循環鏈表解決約瑟夫環問題

  約瑟夫環問題可以簡單的使用數組的方式實現,但是現在我使用循環鏈表的方法來實現,因為上午看到一道面試題規定使用循環鏈表解決約瑟夫環問題。

  什么是約瑟夫環?

  “約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的人全部出列。”(百度百科中的解決辦法列出了很多,可以看到循環鏈表并不是最簡單的方法)

  這道面試題考察了循環鏈表的“創建”,“遍歷”和“刪除”。

創建的循環鏈表的結構圖:

解決約瑟夫環問題的過程

C++實現代碼如下:

循環鏈表解決約瑟夫問題
 1 /**循環鏈表解決約瑟夫環問題
 2  * 問題:約瑟夫環
 3  * 有編號從1到N的N個人坐成一圈報數,從第K個人開始報數,報到M的人出局,
 4  * 下一位再從1開始報數,如此持續,直止剩下一位為止,報告此人的編號X。
 5  * 輸入N,K,M,求出X。
 6  */
 7 
 8 #include <iostream>
 9 using namespace std;
10 
11 struct MyNode
12 {
13     MyNode(int a_data):m_data(a_data),m_pNext(NULL) {}
14     
15     int    m_data;
16     MyNode *m_pNext;
17 };
18 
19 class Josephus
20 {
21 public:
22     Josephus(int a_N, int a_K, int a_M):m_N(a_N),m_K(a_K),m_M(a_M)
23     {
24         createList();
25         outputList();
26     }
27     
28 protected:
29     void createList();
30     void outputList();
31     
32 private:
33     MyNode *m_pHead;//循環鏈表的頭節點
34     int    m_N;     //鏈表節點個數
35     int    m_K;     //第一個報數人的序號
36     int    m_M;     //報數出局的數
37 };
38 
39 void Josephus::createList()
40 {
41     MyNode *pre = NULL;
42     MyNode *cur = NULL;
43     MyNode *p = new MyNode(1);
44     m_pHead = p;
45     cur = p;
46     for (int i=2; i<=m_N; i++)
47     {
48         p = new MyNode(i);
49         pre = cur;
50         cur = p;
51         pre->m_pNext = cur;
52     }
53     cur->m_pNext = m_pHead;
54     
55     int n=m_N;
56     p = m_pHead;
57     while (n--)
58     {
59         cout << p->m_data << ",";
60         p = p->m_pNext;
61     }
62     cout << endl;
63 }
64 
65 void Josephus::outputList()
66 {
67     MyNode *pre = NULL;
68     MyNode *cur = m_pHead;
69     m_K--;
70     while (m_K--)            //尋找第K個人(開始報數的人)
71     {
72         pre = cur;
73         cur = cur->m_pNext;
74     }
75     while (m_N--)            //輸出鏈表中所有的節點值
76     {
77         int s = m_M-1;
78         while (s--)            //尋找間隔M的人
79         {
80             pre = cur;
81             cur = cur->m_pNext;
82         }
83         MyNode *p = cur;
84         cout << p->m_data << ",";
85         cur = cur->m_pNext;    //刪除節點的過程
86         pre->m_pNext = cur;
87         delete p;
88         p=NULL;
89     }
90 }
91 
92 int main()
93 {
94     Josephus josephus(100,5,5);
95     return 0;
96 }

?

測試結果:

轉載于:https://www.cnblogs.com/hanxi/archive/2012/10/10/2718413.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260326.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 什么時候進行垃圾回收_java什么時候進行垃圾回收,垃圾回收的執行流程

java的垃圾回收分為三個區域新生代 老年代 永久代一個對象實例化時 先去看伊甸園有沒有足夠的空間如果有 不進行垃圾回收 ,對象直接在伊甸園存儲.如果伊甸園內存已滿,會進行一次minor gc然后再進行判斷伊甸園中的內存是否足夠如果不足 則去看存活區的內存是否足夠.如果內存足夠…

常用的webservice接口

商業和貿易&#xff1a; 1、股票行情數據 WEB 服務&#xff08;支持香港、深圳、上海基金、債券和股票&#xff1b;支持多股票同時查詢&#xff09; Endpoint: http://webservice.webxml.com.cn/WebServices/StockInfoWS.asmx Disco: http://webservice.webxml.com.cn/WebServ…

基于HTML5 Canvas 實現矢量工控風機葉輪旋轉

之前在拓撲上的應用都是些靜態的圖元&#xff0c;今天我們將在拓撲上設計一個會動的圖元——葉輪旋轉。 先看看最后我們實現的效果&#xff1a;http://www.hightopo.com/demo/fan/index.html 我們先來看下這個葉輪模型長什么樣 從模型上看&#xff0c;這個葉輪模型有三個葉片&a…

java 并發模型總類_java并發編程系列-內存模型基礎

java線程之間的通信對程序開發人員是完全透明的&#xff0c;內存的可見性問題很容易困擾很多開發人員。本篇博文將揭開java內存模型的神秘面紗&#xff0c;來看看內存模型到底是怎樣的。并發編程模型的分類并發編程中需要處理的兩個關鍵問題&#xff1a;線程之間如何通信線程之…

python調用java的jar包_python調用java的jar包報錯127

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓最近在弄python需要調用到Java的jar包&#xff0c;按照網上的教程走&#xff0c;最后總是報錯No matching overloads found for [init in find. at native\common\jp_method.cpp:127Java&#xff1a;package aes;import com.sun.cr…

iphone、Android接收System.Net.Mail發的郵件標題亂碼

參考地址&#xff1a;http://blog.csdn.net/whowhen21/article/details/5959225 在做項目時候&#xff0c;用到.Net的System.Net.Mail發送郵件&#xff0c;經測試&#xff0c;發現如果標題過長&#xff0c;收到的就會是亂碼了(那種Base64格式的數據)&#xff0c;幾經測試&#…

數據倉庫與數據挖掘的一些基本概念

下面內容摘自互聯網并作了整理。 名詞&#xff1a; BI(Business Intelligence)&#xff1a;商業智能&#xff0c; DW(Data Warehouse)&#xff1a;數據倉庫&#xff0c;詳見正文Q1部分。 OLTP(On-Line Transaction Processing)&#xff1a;聯機事務處理 也稱為面向交易的處理系…

ATS讀小文件(內存命中)

一個資源根據其大小可能會存在多個存儲對象中。如果足夠小&#xff08;連同doc結構的大小小于一個fragment的size&#xff09;&#xff0c;連同這個資源的meta信息一起存儲在一個doc中。如果比較大&#xff0c;第一個存儲對象保存資源的meta信息&#xff0c;后面跟著若干個frag…

python 加密解密_python加密解密

EncodeFile(python2.7加密)# -*- coding: utf8 -*-import base64import sysreload(sys)sys.setdefaultencoding(utf8)inFilesys.argv[1]try:fin open(inFile, "rb")fout open(inFile".txt", "w")base64.encode(fin, fout)passexcept Exception…

java double 兩位_java double 保留兩位小數

java保留兩位小數問題&#xff1a;方式一&#xff1a;四舍五入double f 111231.5585;BigDecimal b new BigDecimal(f);double f1 b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();保留兩位小數---------------------------------------------…

fatal error C1902: 程序數據庫管理器不匹配;請檢查安裝解決

終于找到原因了&#xff0c;原來是我安裝的字體渲染&#xff0c;并且采用注冊表的加載方式&#xff01;改掉就好了&#xff01;上天哪&#xff0c;這是怎么影響到的 卸載MacType程序后&#xff0c;進行嘗試&#xff01; VS2008 和 VS2010 又能用了&#xff01; 我想求教育。。。…

一分鐘明確 VS manifest 原理

什么是vs 程序的manifest文件 manifest 是VS程序用來標明所依賴的side-by-side組建,如ATL, CRT等的清單。 為什么要有manifest文件 一臺pc上&#xff0c;用一組建往往會有不止一個版本號&#xff08;c:/windows/winsxs或系統文件夾下&#xff09;&#xff0c;程序在載入的時候&…

[譯]多線程網絡服務模型

2019獨角獸企業重金招聘Python工程師標準>>> 多線程網絡服務模型 /*** 謹獻給Yoyo** 原文出處&#xff1a;https://www.toptal.com/software/guide-to-multi-processing-network-server-models* author dogstar.huang <chanzonghuanggmail.com> 2016-04-02*/作…

likely(x)與unlikely(x)函數,即__builtin_expect的使用

轉載自&#xff1a;http://velep.com/archives/795.html 本文講的likely()和unlikely()兩個宏&#xff0c;在linux內核代碼和一些應用中可常見到它們的身影。實質上&#xff0c;這兩個宏是關于GCC編譯器內置宏__builtin_expect的使用。顧名思義&#xff0c;likely()指“很有可能…

java mvc引擎_SpringMvc+JavaConfig+Idea 搭建項目

1.介紹之前搭建SpringMvc項目要配置一系列的配置文件&#xff0c;比如web.xml,applicationContext.xml,dispatcher.xml。Spring 3.X之后推出了基于JavaConfig方式以及注解的形式的配置。在一定程度上簡化了Spring項目的配置。近幾年特別火的SpringBoot&#xff0c;大大的簡化了…

window.parent和window.opener區別

下面一段代碼是關于window.parent和window.opener區別 來講的&#xff0c;我們如果要用到iframe的值傳到另一框架就要用到window.opener.document.getElementById(name).value uvalue;這種形式哦。 window.parent能獲取一個框架的父窗口或父框架。頂層窗口的parent引用的是它本…

極域電子書包課堂管理系統_【君蓮微訊】君蓮學校(小學部)開展電子書包第13共同體數學研討活動...

借 助 媒 體 技 術豐 富 圖 形 認 識君蓮學校(小學部)開展電子書包共同體 數學研討活動 2020年12月2日下午&#xff0c;君蓮學校(小學部)開展了以“借助媒體技術 豐富圖形認識”為主題的閔行區電子書包第13共同體的數學研討活動。共同體學校教師代表、學校電子書包項目組主管朱…

python批量改動指定文件夾文件名稱

這小樣例僅僅要是說明用python怎么批量改動指定文件夾的文件名稱&#xff1a; 記得要把腳本跟改動的文件放在同一個文件夾下 #encoding:utf-8 import os import sys files os.listdir(D:\\1) #路徑能夠自己for name in files:a os.path.splitext(name)if a[1] .txt: #txt能夠…

Linux vmstat命令實戰詳解

vmstat命令是最常見的Linux/Unix監控工具&#xff0c;可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率&#xff0c;內存使用&#xff0c;虛擬內存交換情況,IO讀寫情況。這個命令是我查看Linux/Unix最喜愛的命令&#xff0c;一個是Linux/Unix都支持&#xff0c;二是…

python的基礎網絡編程是下列_Python入門基礎之網絡編程、socket編程、TCP、UDP編程...

忙了兩天&#xff0c;繼續更文&#xff01;希望多多支持。套接字套接字是一種具有之前所說的"通訊端點"概念的計算機網絡數據結構。網絡化的應用程序在開始任何通訊之前都必需要創建套接字。套接字有三種&#xff1a;1、 AF_UNIX(在 POSIX1.g 標準中也叫 AF_LOCAL)&a…