`
koberichard
  • 浏览: 6289 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

有一个整数数组,请求出两两之差绝对值最小的值

 
阅读更多
using System;


namespace MinABS
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 100;
            int[] a = new int[n];
            Random rand = new Random();
            int min = int.MaxValue;
            int max = int.MinValue;
            Console.WriteLine("产生了" + n + "个数据的实验数组,");
            for (int i = 0; i < n; i++)
            {
                //赋值并且取到最大最小值
                //a[i] = rand.Next(int.MinValue, int.MaxValue);
                 a[i] = rand.Next(-100, 100);
                if (a[i] < min) { min = a[i]; }
                if (a[i] > max) { max = a[i]; }
                 Console.Write(a[i] + " ");               
            }
             Console.WriteLine();
            Console.WriteLine("在O(n)内得到最大最小分别是:");
            Console.WriteLine(max + "和" + min);
           
            long offset = (long)max + Math.Abs((long)min);
            //规划数组的长度。每个byte有8位长
            int len = (int)(offset >> 3) +1 ;
            Byte[] B = new Byte[len];
            int kkkk = 0;
            bool IsSame = false;//是否有重合点标记
          
            //O(n)的时间内分配到了Byte[]中。
           
            for (int i = 0; i < n; i++)
            {
                offset = (long)a[i] - (long)min;
                int index = (int)(offset >> 3);
                int temp = B[index];
                //把末k位变成1
                //把右数第k位变成1 例如:(00101001->00101101,k=3)     x | (1 << (k-1))
            
                int tempOffSet = (1 << (  (int)(offset & 7) ) );
                //判断重合
                if (!IsSame)
                {
                    kkkk = temp & tempOffSet;
                    if ((temp & tempOffSet) >= 1)
                    {
                        IsSame = true;
                        //如果0算最小距离就在这里退出吧。本代码判断重合,但没把0作为结果。                       
                    }
                }
                int bbb = B[index];               
                B[index]  |=  (Byte)(tempOffSet);         
                int aaa = B[index];
 
            }
            //最小距离初始为最大。

            Console.WriteLine("在O(n)的时间内分配到了Byte[]中,正在计算最小距离,请稍候。。。。。");

            long minABS = long.MaxValue;
            long lastIndex = -1;

            //在常数范围内循环,复杂度不增加。最坏的情况是32*int.MaxValue次。

            for (int i = 0; i < B.Length; i++)
            {
                //if (B[i] == 0) { continue; }
                //在常数范围内循环,复杂度不增加。
                for (int k = 0; k < 8; k++)
                {
                    if (((B[i] >> k) & 1) == 1)
                    {
                        if (lastIndex >= 0)
                        {
                            long temp = ((long)i << 3) + k - lastIndex;
                            if (temp < minABS)
                            {
                                minABS = temp;
                               Console.WriteLine("目前得到了最小距离:" + minABS);
                            }
                        }
                        lastIndex = (i << 3) + k;                       
                    }
                }
            }
            if (IsSame)
            { Console.WriteLine("有重合点"); }
            else
            { Console.WriteLine("无重合点"); }

            Console.WriteLine("不考虑重合最小距离是:" + minABS);
            Console.WriteLine("总复杂度是:O(n)");           

            Console.ReadLine();

        }


    }
}

分享到:
评论

相关推荐

    1.给出一个整数数组,求其中任意两个元素之差的最大值。

    题目要求给定一个整数数组,计算并返回数组中任意两个元素之差的最大值。 #### 解决方案 为了找到数组中任意两个元素之差的最大值,可以采用排序的方法。首先对数组进行排序,然后计算排序后数组中最大值与最小值...

    现在有一个简单游戏:表达式游戏

    本问题来源于一个简单的数学游戏,旨在通过在给定的一系列整数间插入不同的算术运算符(加、减、乘、除)来构造一个表达式,使得该表达式的计算结果最大,同时还需要满足一个额外的条件——最终结果不能包含某个特定...

    给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍。

    给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍。 比如给定1 4 3 2 9 7 18 22,得到的答案是3,因为2是1的两倍,4是2的两倍,18是9的两倍。 输入形式 输入...

    腾讯笔试题——有趣的数字

    小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入描述: ...对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。

    微软、谷歌、百度等公司经典面试100题[第101-170题].pdf

    - **题目描述**:给定一个整数数组,请求出两两之差绝对值最小的值。 - **解决方案**:可以先对数组进行排序,然后遍历相邻元素,计算它们之间的差值的绝对值,并记录最小值。 **2. 字符是否为整数及转换** - **...

    数字字母特殊字符两两混合正则表达式1

    数字字母特殊字符两两混合正则表达式1

    数字字母特殊字符两两混合正则表达式

    在“数字字母特殊字符两两混合”的场景下,我们需要构建一个正则表达式来匹配满足特定条件的字符串。这个条件是每个字符都是数字、字母或特殊字符,并且它们必须两两交替出现。 首先,让我们理解一下什么是数字、...

    多个样本的非参数检验的两两比较精.pdf

    这是一个非参数检验,用来检查多个独立样本的总体分布是否相同。SAS中可以通过`NPAR1WAY`过程执行Kruskal-Wallis检验。 2. **RANK和ANOVA结合**:对于两两比较,可以结合使用`RANK`和`ANOVA`过程。首先,使用`RANK`...

    双色球AC值研究

    3. **去除重复值**:如果得到的差值中有重复的,则仅保留一个。 4. **计算不同差值的个数**:统计最终得到的不同差值的个数,记为\(D(t)\)。 5. **计算AC值**:最终的AC值计算公式为:\(AC值 = D(t) - (r - 1)\),...

    数组实训.doc

    在这个例子中,定义了一个整数数组`a`,然后使用两个嵌套循环,外层循环控制比较的趟数,内层循环进行两两比较并交换位置,直到数组完全排序。 3. **选择排序法**:选择排序是另一种基本的排序算法,它每次从未排序...

    多个样本率的卡方检验及两两比较--之-spss-超简单.docx

    卡方检验是一个有用的统计方法,可以帮助我们判断多个样本率的差异。在本研究中,我们使用 SPSS 软件来进行卡方检验和两两比较,结果表明三个干预组之间存在显著差异。这项研究结果可以为临床医生和研究人员提供有...

    C、C++各大公司面试笔试题

    * 题目 1:找出两两之差绝对值最小的值 这道题目考察候选人的数组操作能力和数学知识。 * 题目 2:写一个函数,检查字符是否是整数 这道题目考察候选人的字符串操作能力和函数设计能力。 * 题目 3:给出一个函数来...

    微软面试15题

    1. 两两之差绝对值最小的值:此题考察数组处理和最优化问题。可以通过排序数组,然后计算相邻元素之间的差值,找到最小的差值。 2. 字符转整数函数:可以使用C++的`std::stoi`函数,或者自定义函数,通过遍历字符串...

    1397_oj_

    在这个描述中,“给定n个正整数,请问它们两两之间的绝对值之差的和为多少?”是一个数学与计算机科学相结合的问题,它涉及到数组处理、循环、绝对值计算以及求和等基本概念。 首先,我们需要理解问题的核心:计算...

    序列两两比对基本算法

    例如,计算(1,1)的值时,我们比较了序列s的第一个字符"A"与序列t的第一个字符"A",得到得分1,因此(1,1)的值是1。 接着,我们计算(1,2)的值,考虑所有可能的路径,最终选择得分最高的路径,即从(1,1)出发,得分是0...

    机器学习基于R语言实现的十种回归算法源码使用loocv框架拟合出(两两结合,共180种组合,加上其本身)190种组合.zip

    机器学习基于R语言实现的十种回归算法源码使用loocv框架拟合出(两两结合,共180种组合,加上其本身)190种组合.zip机器学习基于R语言实现的十种回归算法源码使用loocv框架拟合出(两两结合,共180种组合,加上其本身)...

    l两两相连的房间问题

    每个房间可以看作图中的一个节点,每扇门代表一个有方向的边,从一个节点指向另一个节点。 2. **数据结构选择**:可以选择使用邻接矩阵来表示这个有向图。邻接矩阵是一个二维数组,其中的元素表示节点之间的连接。...

    C语言下的冒泡排序,可以直接编译使用

    这个函数接收一个整数数组arr和数组的长度n为参数,并对数组进行升序排序。通过使用两个嵌套的循环结构,本程序对数组中的元素两两比较,并交换它们的位置,直到所有元素被正确排序。 在main函数中,程序声明了一个...

Global site tag (gtag.js) - Google Analytics