简单算法的实现

?1.数字模式的识别:

?数字的模式是指在一堆给定数字中出现次数最多的数值,如5,5,5,3,3,2,6,4,它的模式就是5。现在你的任务,就是从数字中找到它的模式.


#include <stdio.h>

#define MAX 4000001

int
arr[MAX];

int
main()

{


arr[MAX]=0;


int
n;
int
max;
int
a;
int
index;


scanf
(
"%d"
,&n);


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


{


scanf
(
"%d"
,&a);


arr[2000000+a]++;


}


max=0;


for
(
int
j=2000000;j<MAX;j++)


{


if
(arr[j]>max)


{


max = arr[j];


index = j;


}


}


printf
(
"%d\n"
,index-2000000);


return
0;

}

这道题目最大的破题思路就是把数字变成写数组的下标,数字的模变成新数组的值!

2.变位词

如果两个单词的组成字母完全相同,只是字母的排列顺序不一样,则它们就是变位词,两个单词相同也被认为是变位词。如tea 与eat , nic 与cin, ddc与dcd, abc与abc 等。你的任务就是判断它们是否是变位词。


 

#include "stdio.h"

#include <string.h>

int
main()

{


void
BubbleSort(
char
arr[],
int
n);


int
n;


char
str1[100];


char
str2[100];


scanf
(
"%d"
,&n);


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


{


scanf
(
"%s"
,&str1);


scanf
(
"%s"
,&str2);


BubbleSort(str1,
strlen
(str1));


BubbleSort(str2,
strlen
(str2));


if
(
strcmp
(str1,str2)==0)


{


printf
(
"Yes\n"
);


}


else


{


printf
(
"No\n"
);


}


}


return
0;

}


void
BubbleSort(
char
arr[],
int
n)


{


int
i,j;


char
temp;


for
(i=0;i<n-1;i++)


{


for
(j=0;j<n-1-i;j++)


{


if
(arr[j]>arr[j+1])


{


temp=arr[j];


arr[j]=arr[j+1];


arr[j+1]=temp;


}


}


}


}

该题就是把字符串排序,然后对比就OK了,当然使用快排或者归并排序可以大大提高程序效率!

3.翻煎饼

麦兜最喜欢的食物是煎饼,每次在街上看到煎饼摊的时候都会在那里停留几分钟。最吸引麦兜还是煎饼师傅那一手熟练的翻煎饼的技术,一堆煎饼在那里,师傅只需要用铲子翻几下,就让煎饼整齐的叠在了一起。 这天,为了庆祝麦兜被保送上研究生,他从煎饼师傅那里买回来一些煎饼请客。但是麦兜买回的煎饼大小不一,麦兜太想吃煎饼了,他想吃这些煎饼中最大的那个。麦兜还知道同学们也很喜欢煎饼,为了表示他的诚意,他想让同学们先吃,麦兜最后吃,因此,麦兜想把煎饼按照从小到大的顺序叠放在一起,大的在最下面。这样麦兜就可以在最后拿到最大的那一块煎饼了。 现在请你帮助麦兜用煎饼师傅翻煎饼的方法把麦兜买的煎饼从小到大的叠在一起。煎饼师傅的方法是用铲子插入两块煎饼之间,然后将铲子上的煎饼翻一转,这样铲子上第一个煎饼就被翻到了顶上,而原来顶上的煎饼则被翻到了刚才插入铲子的地方。麦兜希望这样翻煎饼的次数最少。


 

#include<stdio.h>

#include<iostream>

#include<algorithm>

#include<string>

#include<math.h>

int
arr[1000];

using
namespace
std;

void
SwapIndex(
int
n)

{


for
(
int
i=0;i<n/2;i++)


{


int
t=arr[i];


arr[i]=arr[n-1-i];


arr[n-1-i]=t;


}

}

int
main()

{


int
n,i,j;


int
count=0;


//scanf("%d",&n);


cin>>n;


for
(i=0;i<n;i++)


{


//scanf("%d",&arr[i]);


cin>>arr[i];


}


while
(n>1)


{


//每次得到最大值,然后想办法把最大值放到数组首位,然后通过交换把最大值放到最下面!


int
max=0,index=0;


for
(j=0;j<n;j++)


{


if
(arr[j]>max)


{


max=arr[j];


index=j;


}


}


if
(index==0)


{


count++;


SwapIndex(n);


}


else
if
(index<n-1)


{


count+=2;


SwapIndex(index+1);


SwapIndex(n);


}


n--;


}


printf
(
"%d\n"
,count);


return
0;

}

解题思路:想办法把最大值交换到数组的第一位置,然后再次交换数组最后位置!数组数减一!

4.约瑟夫问题的实现

n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。

第一种:


 

#include<iostream>

using
namespace
std;

int
main()

{


int
n,k;


cin>>n>>k;


int
i,s=0;


for
(i=2;i<=n;i++)


{


s=(s+k)%i;


}


cout<<s+1;


return
0;

}

通过数学公式!

第二种:


 

#include<stdio.h>

#include<iostream>

#include<algorithm>

#include<string>

#include<math.h>

using
namespace
std;

typedef
struct
Link


{


int
data;


struct
Link * next;


}link;


/*采用尾插法建立链表*/


void
createLink(link *&l,
int
a[],
int
n)


{


link *r,*s;


int
i;


l = (link*)
malloc
(
sizeof
(link));


r=l;
//r始终代表链表的首部


for
(i=0;i<n;i++)


{


s = (link * )
malloc
(
sizeof
(link));


s->data=a[i];


r->next=s;


r=s;


}


r->next=l->next;
//循环单链表


}


void
getWin(link *&l,
int
n,
int
k)


{


link *p, *cur;


p=l->next;
//第一条数据


cur = p;
//当前指针


int
count=0,j=0;


while
(1)


{


j++;


if
(j==k)


{


if
(count==n-1)


{


printf
(
"%d\n"
,cur->data);


break
;


}


j=0;


p->next=cur->next;
//链表的删除


free
(cur);


cur=p->next;


count++;


}


else


{


p=cur;


cur=cur->next;


}


}


}

int
main()

{


link *head;


int
a[100],n,i,k;


scanf
(
"%d %d"
,&n,&k);


for
(i=0;i<n;i++)


{


a[i]=i+1;


}


createLink(head,a,n);


getWin(head,n,k);


/*link *p = head->next;


while(p->next!=NULL)


{


printf("%d",p->data);


p = p->next;


}


printf("%d",p->data);*/


return
0;

}

通过单循环链表来实现!

【还有6道算法题目没做呢,加油!】

时间: 2024-10-30 01:36:30

简单算法的实现的相关文章

STL简单&lt;stl_algorithms.h&gt;算法的实现

1.简介 STL标准中,没有区分基本算法和复杂算法,然而SGI STL却把常用的算法定义在<stl_algorithms.h>中.本文介绍部分<stl_algorithms.h>算法的实现,给出实现代码和测试代码. 本文介绍的算法包括: 1.      mismatch:比较两个序列,指出两者之间第一个不匹配的点,返回一对迭代器,分别指向两序列中不匹配的点: 2.      equal:如果两个序列在 [first, last ] 区间内相等,equal() 返回true,忽略第二

STL简单 copy 算法的实现

1.简介 不论是对客户端或对STL内部而言,copy() 都是一个常常被调用的函数.由于copy进行的是复制操作,而复制操作不外乎运用赋值运算符(assignment operator)或复制构造函数(copy constructor),但是某些元素的类型是trivial assignment operator,因此如果能使用内存直接进行复制(例如使用C标准函数memmove.memcpy),便能节约大量时间.为此,copy算法用尽各种办法,包括函数重载(function overloading

搜索引擎--范例:中英文混杂分词算法的实现--正向最大匹配算法的原理和实现

纯中文和中英文混杂的唯一区别是,分词的时候你如何辨别一个字符是英文字符还是孩子字符, 人眼很容易区分,但是对于计算机来说就没那么容易了,只要能辨别出中文字符和英文的字符,分词本身就不是一个难题 1:文本的编码问题: utf8:windows下,以utf8格式保存的文本是一个3个字节(以16进制)的BOM的,并且你不知道一个汉字是否是用3位表示,但是英文适合ascii编码一样的 ascii:英文一位,中文两位,并且中文的第一个字节的值是大于128和,不会和英文混淆,推荐 unicode:中文基本是

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

Bug2算法的实现(RobotBASIC环境中仿真)

移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不能看几遍就理解理论中的奥妙,只能在别人大谈XX理论XX算法的时候,自己一个人苦逼的面对错误的程序问为什么... 下面开始动手来实现一下简单的Bug2避障算法.由于算法中涉及到机器人与外界环境的交互,因此需要选择一个仿真软件.常用的移动机器人仿真软件主要有Gazebo.V-rep.Webots.MRD

软考笔记第六天之各排序算法的实现

对于前面的排序算法,用c#来实现 直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序.第一趟比较前两个数,然后把第二个数按大小插入到有序表中: 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中:依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程.直接插入排序属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1).直接插入排序是由两层嵌套循环组成的.外层循环标识并决定待比较的数值.内层循环为待比较数值确定其最终位

RMQ问题总结,标准RMQ算法的实现

RMQ问题:对于长度为N的序列,询问区间[L,R]中的最值 RMQ问题的几种解法: 普通遍历查询,O(1)-O(N) 线段树,O(N)-O(logN) DP,O(NlogN)-O(1) RMQ标准算法,O(N)-O(1) 简单介绍: 朴素的查询,不需要任何预处理,但结果是没有任何已知的信息可以利用,每次都需要从头遍历到尾. 线段树,区间问题的神器,用线段树做比起朴素的暴力查询要快得多,关键在于线段树使用了分治思想,利用了区间问题的可合并性.任何一个区间最多只需要logN个线段树上的区间来合并,线

最小生成树之Prim算法的实现

Prim算法的思想是,首先从任意一个节点出发,逐渐生成,直至该树覆盖了所有的V中的节点. 如下图: 图中的黑色的边即是最小生成树中的边. 实现Prim算法的关键便是,如何选择一条 "权值较小并且对于已有生成树中的点集合S来说是安全的边",此处的安全指的是: 加入该边e之后,S仍然是一个树. 于是:对于图 G = (V, E) Prim的执行步骤大致为: 1   从任意节点r开始,因此将原来的顶点集合分为两部分: S = {r}, T = V-{s}, 2   计算T中的节点到S中的节点

详细MATLAB 中BP神经网络算法的实现

MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤 这里以一个普遍实用的简单案例为例子进行编程的说明. 假设一组x1,x2,x3的值对应一个y值,有2000组这样的数字,我们选择其中1900组x1,x2,x3和y作为样本,其余100组x1,x2,x3作为测试数据来验证.   首先需要读取这些数据,并把数据赋值给input 和 output . 我是把数据存储