精华内容
下载资源
问答
  • 设有int型两个变量 a和b,不借助于临时变量可用异或法交换两个变量的,注意这里的异或为位异或...可以实现两个变量值得交换,已知异或操作满足交换律和结合律,a^a=0,0^a=a;故而上述操作解释为:  a = a ^ b (1);

    设有int型两个变量 a和b,不借助于临时变量可用异或法交换两个变量的值,注意这里的异或为位异或操作;

    通过操作

            a = a ^ b;
            b = b ^ a;
            a = a ^ b;

    可以实现两个变量值得交换,已知异或操作满足交换律和结合律,a^a=0,0^a=a;故而上述操作解释为:

            a = a ^ b   (1);
            b = b ^ a   (2);b=b^a^b=b^b^a=0^a=a
            a = a ^ b   (3);将右边的a用(1)展开b用(2)展开为a=a^b^b^a,注意,这里右边的两个a值不同,最右边的a=a^b;

    故而(3)中a=a^b^b^a^b=a^a^b^b^b=0^b=b。值的交换完成

    展开全文
  • 交换两个变量

    1、借助第三个变量来实现

    C = A; A = B; B = C;

    2、利用加减法来实现两个变量的交换

    A = A + B; B = A – B; A = A – B;

    3、用位异或运算来实现,也是效率最高的

    原理:利用一个数异或本身等于0和异或运算符合交换律

    A = A ^ B; B = A ^ B; A = A ^ B;

    展开全文
  • 异或运算性质: 交换律,即 a ^ b ^ c = a ^ c ^ b 结合律, 即 (a ^ b) ^ c = a ^ ( b ^c ) 对于任何数,都有 a ^ a = 0, a ^ 0 = a 自反性, a ^ b ^ b = a ^ 0 = a 思路 通过利用异或运算的交换律,相同的两个...

    leetcode136 —只出现一次的数字


    题目

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    说明:

    你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

    示例 1:

    输入: [2,2,1]
    输出: 1
    示例 2:

    输入: [4,1,2,1,2]
    输出: 4

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/single-number


    方法

    1.位运算法

    异或运算性质

    异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结果为0。

    异或运算性质:

    1. 交换律,即 a ^ b ^ c = a ^ c ^ b
    2. 结合律, 即 (a ^ b) ^ c = a ^ ( b ^c )
    3. 对于任何数,都有 a ^ a = 0, a ^ 0 = a
    4. 自反性, a ^ b ^ b = a ^ 0 = a

    思路

    通过利用异或运算的交换律,相同的两个整数异或后会为0,所以数组中的元素会两两相消,留下单独存在的元素。
    即 a ^ b ^ a = a ^ a ^ b = 0 ^ b = b
    所以对整个数组进行异或操作,结果即为所要查找的值。

    代码如下:

    class Solution:
        def singleNumber(self, nums: List[int]) -> int:
            # 异或运算
            result = 0
            for i in nums:
                result = result^i
            return result
    

    也可以通过lambda生成式简写如下:

    class Solution:
        def singleNumber(self, nums: List[int]) -> int:
            # 异或运算
            return reduce(lambda x,y: x^y, nums)
    

    reduce函数的语法如下:
    在这里插入图片描述
    复杂度分析

    • 时间复杂度:O(n), 遍历整个数组进行了常数次操作。
    • 空间复杂度:O(1), 只存在一个变量。

    这个方法还可以用于 给定数组中一个元素出现两次,其他都是一次,查找这个出现两次的元素问题。

    • 例如1到1000这种知道具体数字的,可以通过与1到1000依次进行异或,运算后的结果就为所求的值。

    2.字典 哈希表法

    • 通过enumerate函数遍历数组生成字典,即哈希表,按照数组的值作为字典的键,在数组中的出现次数作为值。
    • 字典完成后,遍历字典,找到值为1的键并返回,即找到了只出现一次的数字。

    代码如下:

    class Solution:
        def singleNumber(self, nums: List[int]) -> int:
            dict1 = {}
            for i, d in enumerate(nums):
                if d in dict1.keys():
                    dict1[d] += 1
                else:
                    dict1[d] = 1
            for key in dict1.keys():
                if dict1.get(key) == 1:
                    return key
    

    dict.get(key)函数返回字典中键为key的元素值。

    复杂度分析:

    • 时间复杂度:O(n), 遍历整个数组和字典进行了常数次操作。
    • 空间复杂度:O(n), 新生成了一个字典,长度大约为n/2。

    总结

    这道题最优解就是通过异或运算进行操作,只消耗了O(1)的空间。
    哈希表法消耗了更多的空间,没有异或法好。

    下面这个方法不消耗空间,但是非常消耗时间,是其他方法的十多倍,删除操作中找到对应元素d应该会很花时间,并且还要不断更新数组,不实用。

    class Solution:
        def singleNumber(self, nums: List[int]) -> int:    
            while True:
                d = nums[0]
                nums.remove(d)
                try:
                    nums.remove(d)
                except:
                    return d 
    
    
    展开全文
  • 学习任何语言基础时,两个数值得交换是必须掌握的,下面是3种不同的方式(c语言) 方法一:利用数学的计算技巧 1 #include <stdio.h> 2 int main() 3 { 4 5 int a =10, b = 20; 6 7 printf...

    学习任何语言基础时,两个数值得交换是必须掌握的,下面是3种不同的方式(c语言)

    方法一:利用数学的计算技巧

     1 #include <stdio.h>
     2 int main()
     3 {
     4     
     5     int a =10, b = 20;
     6     
     7     printf("交换前a=%d, b=%d\n", a, b);
     8     
     9     a = a - b;
    10     b = a + b;
    11     a = b - a;
    12     
    13     printf("交换后a=%d, b=%d\n", a, b);
    14     
    15     return 0;
    16 }

    这种方法的写法不唯一,对于a,b;只要先给其中一个先赋予a-b,其他的自己算一下就能写出来;

    方法二:第三方变量,也是最常用,可读性最好的

     1 #include <stdlib.h>
     2 #include <stdio.h>
     3 int main()
     4 {
     5 
     6     int a =10, b = 20;
     7     printf("交换前a=%d, b=%d\n", a, b);
     8     
     9     int temp = a;//先定义一个临时变量
    10     a = b;
    11     b = temp;
    12     
    13     printf("交换后a=%d, b=%d\n", a, b);
    14     
    15     return 0;
    16 }

    方法三:位运算,利用^异或运算的特点:a^b^a = a^a^b = 0^b = b,交换律,相同数值异或为0,0和任何数异或为任何数

     1 #include <stdio.h>
     2 int main()
     3 {
     4     int a =10, b = 20;
     5     printf("交换前a=%d, b=%d\n", a, b);
     6     
     7     a = a^b;
     8     b = b^a;
     9     a = a^b;
    10     
    11     printf("交换后a=%d, b=%d\n", a, b);
    12     
    13     return 0;
    14 }

     

    转载于:https://www.cnblogs.com/cxbblog/p/3704899.html

    展开全文
  • 也谈两个变量交换值的算法

    千次阅读 2008-07-11 17:15:00
    function toggleDisplay(itemID){if (itemID.style.display=="block"){ itemID.style.display="none";...}}最近开始回顾计算机技术中的一些基本概念,比如值交换,排序等等。想起了小学三年级暑假学苹
  •   两个变量交换问题: 一:使用中间变量: 方法一:直接变量交换(不推荐) void swap(int a, int b){  int temp;... // 若a==b,则不用交换交换反而浪费...//调用时注意是按传递。 方法二:一级指针变量交
  • 三、基本等值式 基本运算规律 : 幂等律 : A⇔A∨AA \Leftrightarrow A \lor AA⇔A∨A , A∨A⇔AA \lor A \Leftrightarrow AA∨A⇔A 交换律 : A∨B⇔B∨AA \lor B \Leftrightarrow B \lor AA∨B⇔B∨A , A∧B⇔B∧AA...
  • 为什么经过几次异或之后两个数的数值可以发生交换呢?
  • 交换两个变量ab的

    千次阅读 2017-07-07 16:25:54
    问题:交换两个变量ab的,并输出交换后的。 一开始遇到这道题,我的基本想法就是定义一个新的变量c作为中间变量,让c=a,a=b.b=c就可任意完成这个问题了。程序代码如下:   #include&lt;stdio.h&...
  • 想了解更多数据结构以及算法题,可以关注...一般情况下交换两个数字的,我们都会使用一个临时变量,像下面这样 1 private void swap(int[] array, int i, int j) { 2 int temp = array[i]; 3 array[i] = array...
  • 并且异或满足交换律和结合律,即异或式的式中各因子的个数有关,位置无关 又因为异或本身是位运算符,不产生进位则我们能进一步得到以下结论: 对于等长多位(字节)变量a,b,有: a^a=0; a^0=a;b^0=b;...
  • 两个变量的值交换的多种方法

    千次阅读 2016-09-01 20:48:53
    在我的博客“函数参数的传递”(博客地址:http://blog.csdn.net/wxbmelisky/article/details/50833787)一文中谈到过将两个变量的进行交换的 swap 函数实现,它们分别是通过指针和引用并使用中间变量来实现的,...
  • 不创建临时变量交换两个数的 法1: #include<stdio.h> #include<windows.h> int main() { int x = 100; int y = 200; printf("before:%d %d\n", x, y); x = x + y; y = x - y; x = x - y; ...
  • 交换两个变量的除了引入临时变量,还有通过加减或异或等奇淫技巧来完成,现在来介绍其原理并且推广它们。 2 交换的原理 ​ 加减、异或都是可逆运算,现在定义一种可逆运算规则fff,它的逆运算是f−1f^{-1}f−1...
  • 首先先来看一下我们常用的交换算法,使用了一个辅助变量 void swap(int &a, int&b){ int temp = a; a = b; b = temp; }那么,怎么才能不用到这个辅助变量呢? 这里用到辅助变量是因为在更改a=b后要保留原有a的...
  • 交换两个int类型数字的,最简单的方式就是使用一个临时变量 1 public static void swap1(int[] A, int i, int j) { 2 int temp = A[i]; 3 A[i] = A[j]; 4 A[j] = temp; 5 } 如果不使用临时变量,我...
  • 不使用额外的空间 交换2个数
  • * 问题描述:在任务3的基础上扩展,分数类中的对象可以和整型数进行四则运算,且运算符合交换律。 * 程序输出: * 程序头部的注释结束 */ #include<iostream> using namespace std; class CFraction { ...
  • 交换两个的方法

    2017-01-09 19:50:12
    方法1:利用中间变量交换 void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; }方法2:不使用中间变量,直接在a 和 b基础上进行修改 void swap(int &a, int &b) { a += b; b = a - b;
  • 假如有x、y两个数,如何在不占用任何额外空间的情况下交换两个数的? 思路 平时我们在交换两个数的时,往往会用一个中间数temp来实现效果,现在需要不占用任何额外空间,自然就不能使用这种寻常的方法了;这里...
  • After the declaration and defination:int a[] = {1, 2, 3, 4, 5 };a + i equals i + a, they are pointers with the same value pointed to the array element a[i],so a[i] = i[a],(0 #include #include int...
  • /* (程序头部注释开始) * 程序的版权和版本声明部分 ... ...* 文件名称:实现分数类中的运算符重载,在...分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成
  • /* (程序头部注释开始) * 程序的版权和版本声明部分 ... ...* 文件名称:实现分数类中的运算符重载,在...分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成
  • 涉及到两个变量的交换,通常的做法是定义一个临时变量,然后再进行交换。利用异或运算,可以实现交换两个,而不用临时变量。 ...交换律 (a^b = b^a) 结合律 ((a^b)^c = a^(b^c)) 对...
  • 加法交换律3.异或操作符4.python写法 0.目的 看到了<小学生Vita老师>的视频感觉很好玩,因此仅对视频内容做补充和记录 1.临时变量 a;a b:b int t=a; -> a : a b : b t : a a=b; -> a : b b :...
  • 方法一: ...输出a,b可以发现两已经交换 方法二: //异或操作方法 var a=1; var b=2; a=a^b; b=a^b; a=a^b; 输出a,b可以发现两已经交换 交换流程如下: a=1 0000
  • 在计算机中,如果想要交换变量的: Demo1: 常规的算法是 public static void doSwitch(int a,int b){ int temp = a; a = b; b = temp; System.out.println("a:"+a+"b:"+b); } 但是这种方式需要...
  • //主题:两个数交换 //用异或实现 //a^b^b会等于a,异或满足结合 void swap1(int &a,int &b) { a = a^b; b = a^b; a = a^b; } //用临时变量 void swap2(int &a, int &b) { int temp = b; ...
  • 给定两个整数a和b,交换a和b的 设a为a0,b为b0 常规算法: 申请额外变量c,令: c = a0;//c == a0;...用位运算交换两个数的,不使用任何额外空间。...首先要明确异或操作符合交换律和结合律,并且有a...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,684
精华内容 4,673
关键字:

交换值与交换律