精华内容
下载资源
问答
  • 以11为例子,//11:0000 0000 0000 0000 0000 0000 0000 1011 奇数位序列:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 偶数位序列:0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 代码如下: void Print_num(unsigned int num){ int i = ...

    以11为例子,//11:0000 0000 0000 0000 0000 0000 0000 1011
    奇数位序列:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
    偶数位序列:0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
    代码如下:

    void Print_num(unsigned int num){
    	int i = 0;
    	int j = 0;
    	int arr1[16];
    	int arr2[16];
    	for (i = 0; i < 32; i += 2){
    		arr1[j] = ((num >> i) & 1);//奇数位 
    		++j;
    	}
    	j = 0;
    	for (i = 1; i < 32; i += 2){
    		arr2[j] = ((num >> i)&1);//偶数位
    		++j;
    	}
    	printf("奇数序列 ");
    	for (i = 15; i >= 0; i--){
    		printf("%d ", arr1[i]);
    	}
    	printf("\n");
    	printf("偶数序列 ");
    	for (i = 15; i >= 0; i--){
    		printf("%d ", arr2[i]);
    	}
    }
    

    这种方法利用两个数组存储了奇数序列,偶数序列,占用了空间
    也可以用如下方法进行输出
    比如说看奇数位,那每次向右移动31位,再与1得到第一位情况,
    下一次移动29位与1得到第三位,以此类推,所以奇数列可得,类似的偶数列只是开始移动30位

    void Print_num2(unsigned int n){
    	int i = 0;
    	printf("奇数序列 ");
    	for (i = 31; i >= 0; i-=2){
    		printf("%d ", ((n >> i) & 1));
    	}
    	printf("\n");
    	printf("偶数序列 ");
    	for (i = 30; i >= 0; i-=2){
    		printf("%d ", ((n >> i) & 1));
    	}
    	printf("\n");
    }
    
    展开全文
  • 以11为例子,//11:0000 0000 0000 0000 0000 0000 0000 1011 奇数位序列:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 偶数位序列:0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 我之前写过一篇文章与这题一样:...

    以11为例子,//11:0000 0000 0000 0000 0000 0000 0000 1011
    奇数位序列:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
    偶数位序列:0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
    我之前写过一篇文章与这题一样:https://blog.csdn.net/question_mark/article/details/99644495

    方法一:数组存储偶数位以及计数位

    public class PrintNum {
    
        public static void main(String[] args) {
            int value=11;
            int[] arr1={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
            int[] arr2={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
            int j=0;
            for(int i=0;i<32;i+=2){
                arr1[j]=(value>>i)&1;
                j++;
            }
            j=0;
            for(int i=1;i<32;i+=2){
                arr2[j]=(value>>i)&1;
                j++;
            }
            for(int i=15;i>=0;i--){
                System.out.print(arr1[i]);
            }
            System.out.println("");
            for(int i=15;i>=0;i--){
                System.out.print(arr2[i]);
            }
        }
    }
    

    但是这个方法需要创建数组,会占据一定的内存空间,我们也可以用不创建数组的方法输出

    方法二

    public class PrintNum {
    //     以11为例子,//11:0000 0000 0000 0000 0000 0000 0000 1011
    // 奇数位序列:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
    // 偶数位序列:0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
        public static void main(String[] args) {
            int value=11;
            System.out.println("偶数序列");
            for(int i=31;i>0;i-=2){
                System.out.print((value>>i)&1);
            }
            System.out.println("");
            System.out.println("奇数序列");
            for(int i=30;i>=0;i-=2){
                System.out.print((value>>i)&1);
            }
        }
    }
    

    在这里插入图片描述

    展开全文
  • 这个结果,至少会有一个二进制是1(如果都是0,说明两个相等,题目不符)。 举个例子,如果最终异或结果是5,转换成二进制是00000101。此时我们可以选择任意一个是1二进制来分析,比如末位。把两个...

    遍历整个数组,依次做异或运算。由于数组存在两个出现奇数次的整数,所以最终异或的结果,等同于这两个整数的异或结果。这个结果中,至少会有一个二进制位是1(如果都是0,说明两个数相等,和题目不符)。

    举个例子,如果最终异或的结果是5,转换成二进制是00000101。此时我们可以选择任意一个是1的二进制位来分析,比如末位。把两个奇数次出现的整数命名为A和B,如果末位是1,说明A和B转为二进制的末位不同,必定其中一个整数的末位是1,另一个整数的末位是0。

    根据这个结论,我们可以把原数组按照二进制的末位不同,分成两部分,一部分的末位是1,一部分的末位是0。由于A和B的末位不同,所以A在其中一部分,B在其中一部分,绝不会出现A和B在同一部分,另一部分没有的情况。

    这样一来就简单了,我们的问题又回归到了上一题的情况,按照原先的异或解法,从每一部分中找出唯一的奇数次整数即可。

    假设数组长度是N,那么该解法的时间复杂度是O(N)。把数组分成两部分,并不需要借助额外存储空间,完全可以在按二进制位分组的同时来做异或运算,所以空间复杂度仍然是O(1)。
     

    展开全文
  • 如何找到两个数组的中位数

    千次阅读 2019-08-19 12:13:11
    大数组的长度是奇数(11),中位数显然是位于正中的第6个元素,也就是元素5 上面的例子奇数个元素的情况。那么偶数的元素是什么样呢?让我们来看另一个例子: 上图这两个给定数组AB,长度都是5,归并之后的大数...

    在这里插入图片描述

    什么意思呢?让我们来看两个例子:
    在这里插入图片描述
    上图这两个给定数组A和B,一个长度是6,一个长度是5,归并之后的大数组仍然要保持升序,结果如下:
    在这里插入图片描述
    大数组的长度是奇数(11),中位数显然是位于正中的第6个元素,也就是元素5

    上面的例子是奇数个元素的情况。那么偶数的元素是什么样呢?让我们来看另一个例子:
    在这里插入图片描述
    上图这两个给定数组A和B,长度都是5,归并之后的大数组如下:
    在这里插入图片描述
    大数组的长度是偶数(10),位于正中的元素有两个,分别是6和7,这时候的中位数就是两个数的平均值,也就是6.5。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    或许这听起来有点绕,我们仍然用刚才的例子来说明:
    在这里插入图片描述
    如上图所示,对于偶数长度的数组,可以根据中位数分成长度相等的两部分,左半部分最大元素(6),永远小于等于右半部分的最小元素(7)

    对于奇数长度的数组,同样可以根据中位数分成两部分:
    在这里插入图片描述
    如上图所示,对于奇数长度的数组,如果把中位数本身归入左半部分,则左半边长度 = 右半边长度+1。

    左半部分最大元素(5),永远小于等于右半部分的最小元素(6)。
    在这里插入图片描述
    在这里插入图片描述
    什么意思呢?大数组被中位数等分的左右两部分,每一部分根据来源又可以再划分成两部分,其中一部分来自数组A的元素,另一部分来自数组B的元素:
    在这里插入图片描述
    如图所示,原始数组A和B,各自分成绿色和橙色两部分。其中数值较小的绿色元素组成了大数组的左半部分,数值较大的橙色元素组成了大数组的右半部分。

    最重要的是,绿色元素和橙色元素的数量是相等的(偶数情况),而且最大的绿色元素小于等于最小的橙色元素

    假设数组A的长度是m,绿色和橙色元素的分界点是i,数组B的长度是n,绿色和橙色元素的分界点是j,那么为了让大数组的左右两部分长度相等,则i和j需要符合如下两个条件:

    i+j=(m+n+1)/2i + j = (m+n+1)/2
    之所以m+n后面要再加1,是为了应对大数组长度为奇数的情况

    Max(A[i1],B[j1])Min(A[i],B[j])Max(A[i-1],B[j-1]) \leq Min(A[i], B[j])
    直白的说,就是最大的绿色元素小于等于最小的橙色元素

    由于m+n的值是恒定的,所以我们只要确定一个合适的i,就可以确定j,从而找到大数组左半部分和右半部分的分界,也就找到了归并之后大数组的中位数
    在这里插入图片描述
    在这里插入图片描述
    如何利用二分查找来确定i值呢?通过具体事例,让我们来演示一下:
    在这里插入图片描述
    第一步,就像二分查找那样,把 ii 设在数组A的正中位置,也就是让 i=3i=3
    在这里插入图片描述
    第二步,根据 ii 的值来确定 jj 的值,j=(m+n+1)/2i=3j=(m+n+1)/2 - i =3
    在这里插入图片描述
    第三步,验证 iijj,分为下面三种情况:

    1. B[j1]A[i]&amp;&amp;A[i1]B[j]B[j−1] \leq A[i] \quad \&amp;\&amp; \quad A[i−1] \leq B[j]
      说明 iijj 左侧的元素都小于等于右侧,这一组 iijj 是我们想要的

    2. A[i]&lt;B[j1]A[i]&lt;B[j−1]
      说明 ii 对应的元素偏小了, ii 应该向右侧移动

    3. A[i1]&gt;B[j]A[i−1]&gt;B[j]
      说明 i1i-1 对应的元素偏大了,ii 应该向左侧移动

    显然,对于图中例子,属于情况2,A[3]&lt;B[2]A[3] &lt; B[2],所以 ii 应该向右移动

    第四步,在数组A的右半部分,重新确定 ii 的位置,就像二分查找一样
    在这里插入图片描述
    第五步,同第二步,根据 ii 的值来确定 jj 的值,j=(m+n+1)/2i=1j=(m+n+1)/2 - i =1
    在这里插入图片描述
    第六步,同第三步,验证 iijj

    由于 A[5]B[0]A[5] \geq B[0]B[1]A[4]B[1] \geq A[4],所以这一组 iijj 是合适的

    第七步,找出中位数

    如果大数组长度是奇数,那么

    =Max(A[i1],B[j1])中位数 = Max(A[i-1],B[j-1])
    也就是大数组左半部分的最大值

    如果大数组长度是偶数,那么:
    =Max(A[i1],B[j1])+Min(A[i],B[i]) )/2中位数 = (Max(A[i-1],B[j-1]) + Min(A[i], B[i]) \ )/2
    也就是大数组左半部分的最大值和大数组右半部分的最小值取平均

    在本例中,大数组长度是奇数,所以中位数=Max(8,1) = 8

    在这里插入图片描述
    在这里插入图片描述

    1. 数组A的长度远大于数组B
      在这里插入图片描述
      也就是m远大于n,这时候会出现什么问题呢?

      当我们设定了 ii 的初值,也就是数组A正中间的元素,再计算 jj 的时候有可能发生数组越界。

      因此,我们可以提前把数组A和B进行交换,较短的数组放在前面,ii 从较短的数组中取。
      这样做还有一个好处,由于数组A是较短数组,ii的搜索次数减少了。

    2. 无法找到合适的i值

      什么情况下会无法找到合适的i值呢?有两种情况:

      数组A的长度小于数组B,并且数组A的所有元素都大于数组B。
      在这里插入图片描述
      这种情况下,无法通过二分查找寻找到符合 B[j1]A[i]&amp;&amp;A[i1]B[j]B[j−1] \leq A[i] \&amp;\&amp; A[i−1] \leq B[j]ii 值,一直到 i=0i=0 为止。

      此时我们可以跳出二分查找的循环,所求的中位数是B[j-1]。(仅奇数情况)

      数组A的长度小于数组B,并且数组A的所有元素都小于数组B。
      在这里插入图片描述

      这种情况下,同样无法通过二分查找寻找到符合 B[j1]A[i]&amp;&amp;A[i1]B[j]B[j−1] \leq A[i] \&amp;\&amp; A[i−1] \leq B[j]ii 值,一直到 i=(A1)i=(数组A长度-1)为止。

      此时我们可以跳出二分查找的循环,所求的中位数是Max(A[i-1],B[j-1])。(仅奇数情况)
      在这里插入图片描述

    public static double findMedianSortedArrays(int[] arrayA, int[] arrayB) {
            int m = arrayA.length;
            int n = arrayB.length;
            //如果数组A的长度大于等于数组B,则交换数组
            if (m > n) {
                int[] temp = arrayA;
                arrayA = arrayB;
                arrayB = temp;
                int tmp = m;
                m = n;
                n = tmp;
            }
            int start = 0;
            int end = m;
            int mid = (m + n + 1) / 2;
            while (start <= end) {
                int i = (start + end) / 2;
                int j = mid - i;
                if (i < end && arrayB[j - 1] > arrayA[i]) {
                    //i偏小了,需要右移
                    start = i + 1;
                } else if (i > start && arrayA[i - 1] > arrayB[j]) {
                    //i偏大了,需要左移
                    end = i - 1;
                } else {
                    //i刚好合适,或i已达到数组边界
                    int maxLeft;
                    if (i == 0) {
                        maxLeft = arrayB[j - 1];
                    } else if (j == 0) {
                        maxLeft = arrayA[i - 1];
                    } else {
                        maxLeft = Math.max(arrayA[i - 1], arrayB[j - 1]);
                    }
                    if ((m + n) % 2 == 1) {
                        //如果大数组的长度是奇数,中位数就是左半部分的最大值
                        return maxLeft;
                    }
                    int minRight;
                    if (i == m) {
                        minRight = arrayB[j];
                    } else if (j == n) {
                        minRight = arrayA[i];
                    } else {
                        minRight = Math.min(arrayB[j], arrayA[i]);
                    }
                    //如果大数组的长度是偶数,取左侧最大值和右侧最小值的平均
                    return (maxLeft + minRight) / 2.0;
                }
            }
            return 0.0;
    
    }
    public static void main(String[] args) {
        int[] arrayB = new int[]{3, 5, 6, 7, 8, 12, 20};
        int[] arrayA = new int[]{1, 10, 17, 18};
        System.out.println(findMedianSortedArrays(arrayA, arrayB));
    }
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 举一个例子:比如1,2,3,4,5,6,7,8的中位数是45平均值,4是前一半最大值,5是后一半最小值。这给我们启示是,可以用优先队列来解这道题,维护一个大根堆一个小根堆,使用大根堆存储比
  • 计算机中的位运算数值乘除关系 计算机数据存储方式,是以二进制方式进行存储。运算左移右移一般代表数的乘除,但...简单举个例子,如果定义一个5,那么在计算机进行左移1时,得到的数就是10,左
  • 在一个整型数组,一种,出现了奇数次,其他所有出现偶数次 第一问:第一问如何找到出现了奇数的数 第二问:两种出现了奇数次,其他所有出现偶数次,这两个奇数分别是什么? 先说一个运算符号,运算...
  • 大根堆小根堆

    千次阅读 2015-09-12 09:48:04
    先看一下调整好的小根堆大根堆 下面举一个调整的例子 ...下面是一个实际的问题:数据...如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 import java.util.ArrayList; p
  • 预处理相关

    2017-07-22 16:46:49
    5.写一个宏可以将一个数字数位和偶数位交换。  6.写一个宏求两个数中的较大值。  7.编程实现:  两个int(32)整数m和n二进制表达,有多少个(bit)不同?  输入例子:  1999 2299  输出例子:7 ...
  • 题目: (1)算法思想 1.分别找出s1,s2的中位数a,b,再比较他们大小,如果相等返回a,如果不等执行一下步骤 ...注:在去掉时,要区分n为奇数和偶数,特别是为偶数时 例子:如果a&gt;b时,n为偶数,s...
  • CF856C Eleventh Birthday

    2019-09-13 16:00:35
    CF856C Eleventh Birthday ...即一个如果可以被11整除,那他的奇数位和偶数位之和是相等的 举几个个简单的例子 121=11∗11   奇数位之和1+1=2,偶数之和2,相等,所以这个可以被11整...
  • 首先了解一下中位数,假设n是奇数,则中位数是位于中间数值,如果n是偶数,则中位数就是中间两个数平均值。 举个例子:现在有4个人,工资从高到低排列以后,分别是10,11,12,13万,中间两个数是1112,所以...
  • 2.获取一个二进制序列所有的偶数位和奇数位, 分别输出二进制序列。 3. 输出一个整数每一。 4.编程实现: 两个int(32)整数mn二进制表达, 有多少个(bit)不同? 输入例子: 1999 2299 输出例子:...
  • 小程序合集

    2017-11-22 00:21:23
    2.获取一个二进制序列所有的偶数位和奇数位,分别输出二进制序列。 3. 输出一个整数每一。 4.编程实现: 两个int(32)整数mn二进制表达,有多少个(bit)不同? 输入例子: 1999 2299 输出...
  • 当两个操作相应比特有且只有一个1时,结果为1,否则为0。 | | 按非(NOT) | ~ a</code> | 反转操作数的比特,即0变成1,1变成0。 | | 左移(Left shiftÿ...
  • 在编码增加一校验来使编码1数位奇数(奇校验)或者偶数(偶校验),从而使码距变为2。举个例子:01101 我们当前编码,采用奇校验就是在最后补一,因为现在是奇数个1所以要补0,即011010。此时发给...
  • 例子:保留两小数输出浮点数1.2351.345。 注:GCC/G++编译器使用规则是“四舍六入五成双”,当数字为5时若5前面是奇数就进位,是偶数就舍去。(5前奇进偶舍) 所以GCC/G++编译器正确输出结果为1.241.34 ...
  • // =1 // =-1 // =0.6 // =-1.2 经常用模数运算符来判断整数为奇数(=1)或偶数(=0) 。 循环 无条件循环 int sum,x; sum=0; for(x=1;x;x++) { sum+=x; } 有条件循环 private void button1_Click(object sender, ...
  • 这里EAN_13编码要求是13长度数字,并且满足:把所有偶数序号的数相加求和,用求出的和乘3,再把所有奇数序号上的数相加求和,用求出的和加上刚才偶数序号上的数,然后得出能被10整除。(这个规则校验在...
  • 实例023 用三元运算符判断奇数和偶数 实例024 更精确地使用浮点数 实例025 不用乘法运算符实现2×16 实例026 实现两个变量互换(不借助第3个变量) 2.3 条件语句 实例027 判断某一年是否为闰年 实例028 ...
  • 实例024 用三元运算符判断奇数和偶数 实例025 更精确地使用浮点数 实例026 不用乘法运算符实现2×16 实例027 实现两个变量互换(不借助第3个变量) 2.3 条件语句 实例028 判断某一年是否为闰年 实例029 ...
  • 实例024 用三元运算符判断奇数和偶数 实例025 更精确地使用浮点数 实例026 不用乘法运算符实现2×16 实例027 实现两个变量互换(不借助第3个变量) 2.3 条件语句 实例028 判断某一年是否为闰年 实例029 ...
  • 实例024 用三元运算符判断奇数和偶数 35 实例025 更精确地使用浮点数 35 实例026 不用乘法运算符实现2×16 37 实例027 实现两个变量互换(不借助 第3个变量) 37 2.3 条件语句 38 实例028 判断某一年是否为闰年 38...
  • 实例024 用三元运算符判断奇数和偶数 35 实例025 更精确地使用浮点数 35 实例026 不用乘法运算符实现2×16 37 实例027 实现两个变量互换(不借助 第3个变量) 37 2.3 条件语句 38 实例028 判断某一年是否为闰年 38...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    6.数据结构评价算法两个重要指标是(时间复杂度空间复杂度) 【北京理工大学 2001 七、1(2分)】 7. 数据结构是研讨数据_(1)物理结构__(2)逻辑结构 _,以及它们之间相互关系,并对与这种结构定义...
  • java 经典习题.doc

    2009-09-16 11:32:59
    题目:打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方等于该数本身。例如:153是一个"水仙花数",因为153=1三次方+5三次方+3三次方。 1.程序分析:利用for循环控制100-999个数,...
  • 制表位的类型包括:左对齐,居中对齐,右对齐,小数点对齐竖线对齐等,这些制表位的使用方法大致相同,这里仅根据论文公式排版要求目录制作为例说明制表位的使用方法效果,更详细说明请参阅Word...
  • Java范例开发大全 (源程序)

    热门讨论 2011-04-27 07:47:22
     实例129 统计指定文件中的字符个 183  实例130 对象序列化与反序列化 185  实例131 同时显示多个文件 187  实例132 生成zip压缩文件 189  实例133 解压缩zip文件 192  实例134 生成Excel文件 194 ...
  • java范例开发大全源代码

    热门讨论 2011-10-30 23:31:51
     实例129 统计指定文件中的字符个 183  实例130 对象序列化与反序列化 185  实例131 同时显示多个文件 187  实例132 生成zip压缩文件 189  实例133 解压缩zip文件 192  实例134 生成Excel文件 ...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

中位数奇数和偶数的例子