黑马程序员技术交流社区

标题: 给你5个数字,怎么判断他们是否连续 [打印本页]

作者: 大虾挂了    时间: 2013-9-30 17:06
标题: 给你5个数字,怎么判断他们是否连续
我的想法:
先将这5个数字放入一个数组num。
设定个bool类型的flag,初值为true。
将冒泡排序算法稍微改动下。添加“==”判断,若有任意两个元素相等,则把flag改为false,且break掉冒泡排序的循环。
冒泡排序结束后,先判断flag,如果为false,则5个数不连续。
如果flag为true,在判断num[4]-num[0]==4。如果成立,则5个数字连续,如果大于4,则5个数字不连续。
过段时间想代码贴过来

大家还有什么别的想法么?
作者: haxyek    时间: 2013-9-30 17:19
没看太明白, 如果是1,3,5,7,9,11会是什么样子

作者: 段朝骞    时间: 2013-9-30 17:53
先从小到大排序,再计算相邻两数的差值是否为1
可以使用
for(int i = 0; i <arr.Length()-1;i++)
{
   if(arr[i+1]-arr[i]==1)
    {
      return true;
     }
    return false;
}
作者: haxyek    时间: 2013-9-30 17:55
段朝骞 发表于 2013-9-30 17:53
先从小到大排序,再计算相邻两数的差值是否为1
可以使用
for(int i = 0; i

是否连续到底是啥意思,,1,5,4,2,3算连续吗?

作者: 大虾挂了    时间: 2013-9-30 17:58
haxyek 发表于 2013-9-30 17:55
是否连续到底是啥意思,,1,5,4,2,3算连续吗?

算的,跟顺序无关
作者: 段朝骞    时间: 2013-9-30 17:59
haxyek 发表于 2013-9-30 17:55
是否连续到底是啥意思,,1,5,4,2,3算连续吗?

注意前面先从小到大排序

作者: 大虾挂了    时间: 2013-9-30 18:00
段朝骞 发表于 2013-9-30 17:53
先从小到大排序,再计算相邻两数的差值是否为1
可以使用
for(int i = 0; i

这是效率最低的方法了吧。还不如我上面说的那个效率高。
如果有重复的话,必然就不连续了,排序算法都不用进行完就结束了。
如果没有重复的,你这要进行4次循环判定,上面说的那个只要判定一次就行了。

作者: 大虾挂了    时间: 2013-9-30 18:03
haxyek 发表于 2013-9-30 17:19
没看太明白, 如果是1,3,5,7,9,11会是什么样子

现在要求就给5个数字啊。按照我上面说的算法,如果你给的1 3 5 7 9的话,我这里先冒泡排序,并且检查是否有相同的数字。你这里没有相同的数字,而且原本就是从小到大排序的,所以冒泡排序算法循环进行一次就完事了。排序结果就是1 3 5 7 9。然后检查9-1==4。不等于,所以不连续。
作者: 段朝骞    时间: 2013-9-30 18:08
大虾挂了 发表于 2013-9-30 18:00
这是效率最低的方法了吧。还不如我上面说的那个效率高。
如果有重复的话,必然就不连续了,排序算法都不 ...

冒泡排序本身就是效率最低的排序,可以直接使用内置的高级排序方法,相比之下效率差别应该不算大吧
作者: haxyek    时间: 2013-9-30 18:11
明白了。
作者: 黑色L    时间: 2013-9-30 19:34
ASCII  前驱  后继

作者: guo329838627    时间: 2013-9-30 20:10
  1. int[] num = new int[]{0,1,2,3,4 };
  2.             bool IsTrue = true;
  3.             for (int i = 0; i <num.Length-1; i++)
  4.             {
  5.                 if ((num + 1) != num[i + 1])
  6.                 {
  7.                     IsTrue = false;
  8.                 }
  9.             }
  10.             if (!IsTrue)
  11.             {
  12.                 Console.WriteLine("不连续");
  13.             }
  14.             else
  15.             {
  16.                 Console.WriteLine("连续");
  17.             }
复制代码
这是我的方法,你看下
作者: 大虾挂了    时间: 2013-9-30 20:38
段朝骞 发表于 2013-9-30 18:08
冒泡排序本身就是效率最低的排序,可以直接使用内置的高级排序方法,相比之下效率差别应该不算大吧 ...

我不是说冒泡排序算法效率低,我是说你后面检测每个相邻数字是否差1的方法效率太低了,而且当有相同数字的时候直接可以认定不是连续的。
作者: 大虾挂了    时间: 2013-9-30 20:42
guo329838627 发表于 2013-9-30 20:10
这是我的方法,你看下

你这个没懂我题的意思啊,我的意思是只要数字是连续的就行,位置无所谓。这里要是给1 3 2 4 0,我要求结果也应该是连续,你这里肯定结果是不连续了。
你这段代码是不是只有0 1 2 3 4才会得到连续? 1 2 3 4 5都不连续?

作者: §風過無痕§    时间: 2013-9-30 20:43
将5个数放入数组   判断是否有重复!有 out !  没有 排序  求相邻两数之差值   看他们的差值是否都相等吧!
作者: guo329838627    时间: 2013-9-30 22:06
大虾挂了 发表于 2013-9-30 20:42
你这个没懂我题的意思啊,我的意思是只要数字是连续的就行,位置无所谓。这里要是给1 3 2 4 0,我要求结 ...

连续的,不要意思,没看懂你题,你可以这么的,先用冒泡从小到大排序,然后比就行了,你看下我写的代码:
  1. static void Main(string[] args)
  2.         {
  3.             int[] num = new int[]{1,3,2,4,0};
  4.             bool IsTrue = true;
  5.             ////冒泡排序
  6.             for (int i = 0; i < num.Length - 1; i++)
  7.             {
  8.                 for (int j = i + 1; j < num.Length; j++)
  9.                 {
  10.                     if (num[i] > num[j])
  11.                     {
  12.                         int ls;
  13.                         ls = num[i];
  14.                         num[i] = num[j];
  15.                         num[j] = ls;
  16.                     }
  17.                 }
  18.             }
  19.             //判断
  20.             for (int i = 0; i <num.Length-1; i++)
  21.             {
  22.                 if ((num[i] + 1) != num[i + 1])
  23.                 {
  24.                     IsTrue = false;
  25.                 }
  26.             }
  27.             if (!IsTrue)
  28.             {
  29.                 Console.WriteLine("不连续");
  30.             }
  31.             else
  32.             {
  33.                 Console.WriteLine("连续");
  34.             }
  35.         }
复制代码

作者: 鬼谷子    时间: 2013-9-30 23:38
int[] num = new int[]{a,b,d,e,f};
for(int i=0;i<4;i++)
{
for(int j=i+1;j<=4;j++)
{
if(num[i]==num[j]||(num[i]-num[j])>4)
{
return false;
}
}
}
return true;
作者: 帕格尼尼的眼泪    时间: 2013-10-1 00:07
static void Main(string[] args)
        {
            //Mp3 M = new Mp3();
            //M.Playe += new Delegate(M_Playe);
            //M.start();
            //Console.Read();


            int[] num = new int[] { 6, 3, 4, 2, 5 };
            Array.Sort(num);
            Console.WriteLine(Is(num));
            Console.Read();
            
         }
         private static bool Is(int[] num)
         {
              for (int i = 0; i < num.Length - 1; i++)
              {
                   if (num[i] + 1 != num[i+1])
                    {
                        return false;
                    }
              }
              return true;
          }
作者: 段朝骞    时间: 2013-10-1 00:17
段朝骞 发表于 2013-9-30 17:53
先从小到大排序,再计算相邻两数的差值是否为1
可以使用
for(int i = 0; i

说的是思路,不是具体实现

作者: 帕格尼尼的眼泪    时间: 2013-10-1 00:44
guo329838627 发表于 2013-9-30 22:06
连续的,不要意思,没看懂你题,你可以这么的,先用冒泡从小到大排序,然后比就行了,你看下我写的代码: ...

大哥你那个是冒泡么,就算是效率超低的,因为你每次排好的你还进行比较,那样重复了。
下面的是冒泡排序
for (int i = 0; i < num.Length - 1; i++)
{
           for (int j =  num.Length-1-i; j >i; j--)
                    {
                             if (num[j] < num[j-1])
                              {
                                      int  temp=num[j];
                                      num[j]= num[j-1];                                                                          
                                      num[j-1]=temp;
                               }
                     }
}

作者: 荣右铭    时间: 2013-10-1 14:58
先用console.readline读取字符串,放入字符数组中,遍历这个数组,判断这个字符是否属于ascii中数字的范围(ascii中数字值是连续的)。
作者: 大虾挂了    时间: 2013-10-1 15:04
帕格尼尼的眼泪 发表于 2013-10-1 00:44
大哥你那个是冒泡么,就算是效率超低的,因为你每次排好的你还进行比较,那样重复了。
下面的是冒泡排序
...

你楼上说的我没太看懂,你在说谁用的不是冒泡排序啊,我也没说他们谁是冒泡排序啊。我说我的想法是用冒泡排序稍微改动下实现。你这个确实是冒泡排序,不过可以添加个是否有换位的判定再优化一点。
我下面贴下最后的代码。

作者: 大虾挂了    时间: 2013-10-1 15:11
最终代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;

  6. namespace 判断输入数字是否连续
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             int[] num = new int[5];
  13.             string[] adr = new string[] {"第一","第二","第三","第四","最后一" };
  14.             int j;
  15.             bool flag1=false,flag2=false;//分别用于判定是否有换位和是否有相同数字

  16.             Console.WriteLine("请输入5个数字,用回车间隔");
  17.             
  18.             //读取用户输入的5个数字
  19.             for (int i = 0; i < 5; i++)
  20.             {
  21.                 Console.WriteLine("请输入{0}个数字,回车确认", adr[i]);
  22.                 num[i] = Convert.ToInt32(Console.ReadLine());
  23.             }

  24.             //代码的核心部分,冒泡排序算法中添加相等判定
  25.             for (int i = 0; i < num.Length - 1; i++)
  26.             {
  27.                 flag1 = false; //每次循环将换位标识重置
  28.                 for (j = 0; j < num.Length - i - 1; j++)
  29.                 {
  30.                     if (num[j] > num[j + 1])
  31.                     {
  32.                         num[j] = num[j] ^ num[j + 1];
  33.                         num[j + 1] = num[j] ^ num[j + 1];
  34.                         num[j] = num[j] ^ num[j + 1];
  35.                         flag1 = true; //若有换位,则将换位标识设置为true
  36.                     }
  37.                     if (num[j] == num[j + 1]) //相等判定部分
  38.                     {
  39.                         flag2 = true;
  40.                         break; //若有相等元素应直接跳出整个冒泡排序,避免使用goto而采取两次break跳出两次循环
  41.                     }
  42.                 }
  43.                 if (flag2 == true)
  44.                     break; //判定有相等元素,跳出冒泡排序
  45.                 if (flag1 == false)
  46.                     break;
  47.             }

  48.             if(flag2==true) //有相等元素必然不连续
  49.                 Console.WriteLine("不连续");
  50.             else if(num[4]-num[0]==4) //没有相等元素的话,最大元素和最小元素差4则必然连续
  51.                 Console.WriteLine("连续");
  52.             else  //否则不连续
  53.                 Console.WriteLine("不连续");
  54.             
  55.             //foreach(int i in num)
  56.             //    Console.WriteLine(i);

  57.             Console.ReadKey();
  58.         }
  59.     }
  60. }
复制代码

作者: 黄晓波    时间: 2013-10-2 19:23
本帖最后由 黄晓波 于 2013-10-2 19:31 编辑

1、将5个数存数组num中
2、num数组的最大值与最小值之差为4?做下一步判断:数组num中的5个数字不是连续的
3、数组num中是有重复数字?不是连续的:是连续的

作者: 大虾挂了    时间: 2013-10-2 19:37
黄晓波 发表于 2013-10-2 19:23
1、将5个数存数组num中
2、num数组的最大值与最小值之差为4?做下一步判断:数组num中的5个数字不是连续的
...

我上面贴的那段代码基本就是这个思路,只不过我那里是排序和检测重复是同时进行的,如果检测到重复就没必要在进行排序了。没有检测到重复的情况下再用排序后的数组最后一个数减第一个数观察是否为4
作者: 黄晓波    时间: 2013-10-2 19:41
本帖最后由 黄晓波 于 2013-10-2 20:35 编辑
大虾挂了 发表于 2013-10-2 19:37
我上面贴的那段代码基本就是这个思路,只不过我那里是排序和检测重复是同时进行的,如果检测到重复就没必 ...

嗯,只是排序比较费时间些


作者: 熊丽    时间: 2013-10-8 17:15
你的想法肯定是错误的,如 1,4,3,2,5
作者: 大虾挂了    时间: 2013-10-9 08:42
熊丽 发表于 2013-10-8 17:15
你的想法肯定是错误的,如 1,4,3,2,5

你自己去试试嘛,把代码贴上,然后你输入这5个数字,肯定结果是连续啊。
作者: 大虾挂了    时间: 2013-10-9 08:43
黄晓波 发表于 2013-10-2 19:41
嗯,只是排序比较费时间些

目前只会冒泡排序,以后会学习下其他排序的
作者: 大虾挂了    时间: 2013-10-9 08:43
黄晓波 发表于 2013-10-2 19:41
嗯,只是排序比较费时间些

目前只会冒泡排序,以后会学习下其他排序的
作者: 荣右铭    时间: 2013-10-9 10:48
还记得等差数列的求和公式么,先把这五个数相加,再与数列相加的结果比较:
for (int i = 0; i < array.Length; i++)
            {
                sum += array[i];
            }
            if (sum == (array.Length * (array[0] + array[array.Length - 1]) / 2))
            {
                Console.WriteLine("这五个数是连续的");
            }
如果两者相等,证明这五个数是连续的。
作者: 张锟-i    时间: 2013-10-9 17:38
LZ你的题目不太清楚;倘若是想,1,2,3,4,5这样的连续的话可以这样判断,这样的话可以考虑一下等差数列的判断方法。
我是这样想的
1:先用冒泡排序
2:再用最大的数减去最小的数再加1,判断是否等于数组长度,如果相等则是连续的,反之不是。
这个题目LZ确实给的不太清楚;
作者: 顾磊磊    时间: 2013-10-10 01:05
说下我的思路,可以判断任意奇数个数的数字是否连续。
这里简化一下,对5个数字来说,求出平均数average,
那么肯定有一个数和average相等。
依次判断,如果5个数都和average不相等,那么5个数不连续。
5个数依次减去average的结果肯定是-2,-1,0,1,2五个数,当然可以乱序。
5个差值放在list中,依次移除实际5个数与average的差值,如果list中的成员全部移除,那么5个数才是连续的,否则不连续。代码如下
  1. int[] numbers = { 5, 2, 3, 4, 1 }; //简化起见,没让用户手动输入。
  2.             double avr = 1.0*numbers.Sum() / 5; //5个数的平均数,那么这个平均数肯定得跟5个数中的一个数相等。
  3.             bool xx = true ;
  4.             foreach (int n in numbers)
  5.                 if (avr == n)
  6.                     xx = false;     //找到相等数,设置xx为false,,找不到则xx一直未true
  7.             if (xx)   //xx为true的时候,说明肯定不连续。
  8.             {
  9.                 Console.WriteLine("不连续");
  10.                 Console.ReadKey();
  11.                 return;
  12.             }
  13.             //接下来  ,5个与平均数的差值为-2,-1,0,-1,-2
  14.             List<int> request = new List<int>() { -2, -1, 0, 1, 2 };

  15.             foreach (int n in numbers)  
  16.             {
  17.                 request.Remove(n - (int)avr);  //每次移除一个差值,如果是连续的,那么request的5个成员应该被全部移除
  18.             }
  19.             Console.WriteLine(request.Count);
  20.             if (request.Count != 0)       //如果此时还有成员,说明之前的5个数不连续。
  21.             {
  22.                 Console.WriteLine("不连续");
  23.                 Console.ReadKey();
  24.                 return;
  25.             }
  26.             Console.WriteLine("连续");
  27.             Console.ReadKey();
  28.         }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2