华为面试题——约瑟夫问题的C++简单实现(循环链表)

/*

author:jiangxin

Blog:http://blog.csdn.net/jiangxinnju

Function:method of Josephus question

*/

#include <iostream>

using namespace std;

struct node

{

int seq;

node *next;

};

typedef struct node NODE;

void test_Josephus()

{

/*如果共同拥有n人。从第s个人開始数数,每数到m该人出列,后面的人又一次開始数。知道所有人出列*/

int n,s,m;

NODE *head,*last,*current,*prev;

cout << "Input the n,s,m(separate with space):";

cin >> n >> s >> m;

for(int i=1;i<=n;i++) //建立循环链表

{

current = new NODE;

current->seq = i;

current->next = head;

if(i == 1)

{

head = current;

last = current;

}

else

{

last->next = current;

last = last->next;

}

}

current = head; //遍历循环链表,输出序列

do

{

cout << current->seq << " ";

current = current->next;

}while(current!=head);

current = head; //将current置于第s个位置

for(int i=1;i<s;i++)

{

current = current->next;

}

cout << endl;

for(int i=1;i<=n;i++) //共循环n轮,得到一个总体的输出序列

{

for(int j=1;j<m;j++)

{

prev = current;

current = current->next;

}

cout << current->seq << " ";

prev->next = current->next;

delete current;

current = prev->next;

}

}

时间: 2024-12-30 06:59:47

华为面试题——约瑟夫问题的C++简单实现(循环链表)的相关文章

华为历年试题(10约瑟夫环)

约瑟夫环形问题 有30人将其编号,从头开始1,2,3数数,每到3将其删除,一共删去15个数.输出被删去的15个数 #include<iostream> using namespace std; struct LinkList { int val; LinkList* next; LinkList(int a):val(a),next(NULL){} }; LinkList *CreatList(int n) { LinkList *p = new LinkList(1); LinkList *

2014华为上机试题

1.第一题的题目大概是输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2:另外数组的长度不超过50 #include<stdio.h> main() { intnum[50]={0}; inti,n; printf("请输入整型数组的长度(1~50):"); scanf("%d",&n); printf("请输入整型数组的元素:"

华为历年试题(掷骰子游戏 7)

问题描述: 在掷骰子游戏中,会根据所掷数字在地图中前进几步,前进完成后需要根据当前地图位置所示的障碍进行相应操作,其中障碍表示: 1)  9:无障碍 2)  1:停掷一轮,即下轮所掷数字无效: 3)  2:后退两步,如果已经到起点不再后退: 4)  3:奖励前进一步 如果在游戏过程中,已经走到地图终点,则游戏结束.根据输入的地图数组,和5个骰子数的数组,返回最终玩家前进了多少步. 要求实现函数: void dice(int map_len, int* map, int* dice_val, in

华为上机试题

一.题目描述:通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉.比如字符串“abacacde”过滤结果为“abcde”. public String stringFilter(String str) { Map<String, Integer> map = new LinkedHashMap<String, Integer>(); String s = ""; for(int i=0

约瑟夫问题 算法很简单保证每隔人都能看懂用数组实现 利用循环删除数组中的元素

#include<iostream> using namespace std; const int size = 1000; void ArrDel() { int arr[size]; //循环结束标志,一直循环到数组中只剩下最后一个元素结束 int currentNum = size; int count = 0; for (int k = 0; k < size; k++) { arr[k] = k; } //currentNum==1表示数组中只剩下最后一个元素 是循环结束的标志

华为历年试题(数组8)

有一个数组a[N]如a[10]={0,1,2,3,4,5,6,7,8,9} 每隔两个数删除一个数,如0,1,2(删除),3,4,5(删除),6,7,8(删除),9, 到数组尾部回到数组头部继续删除,要求编写一个函数实现实现上述操作, 返回最后一个数的数组下标. 函数接口:int getLast(int iLen) 参数:数组初始元素个数iLen #include<iostream> using namespace std; struct LinkP{ int val; LinkP *next;

背包算法解决一道华为面试题

闲来无事,看到了一篇文章,华为面试题,题目如下: 有两个数组a,b,大小都为n,数组元素的值任意,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小 网址是http://bbs.chinaunix.net/thread-855126-1-1.html这个. 估计多数人想到的都是先sort,再交叉,或者一条龙什么的,包括我.后来一想不对啊,如果前面的都是个位数,最后一个是999怎么办? 抱着学习的态度一页一页往下翻,好多人都是在提出来自己想法,但是我拿我这个999验

华为历年试题(5)

将一个字符串的元音字母复制到另一个字符串,并排序(30分) 问题描述:有一字符串,里面可能包含英文字母(大写.小写).数字.特殊字符,现在需要实现一函数, 将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序 (小写的元音字母在前,大写的元音字母在后,依次有序). 说明:1.  元音字母是a,e,i,o,u,A,E,I,O,U. 2.  筛选出来的元音字母,不需要剔重:最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序. 要求实现函数:vo

约瑟夫问题的C++简单实现(循环链表)

[code=C++] /* author:jiangxin Blog:http://blog.csdn.net/jiangxinnju Function:method of Josephus question */ #include <iostream> using namespace std; struct node { int seq; node *next; }; typedef struct node NODE; void test_Josephus() { /*假设共有n人,从第s个