不佔用任何額外空間的情況下交換兩個數的值
題目
假如有x、y兩個數,如何在不佔用任何額外空間的情況下交換兩個數的值?
思路
平時我們在交換兩個數的值時,往往會用一箇中間數temp來實現效果,現在需要不佔用任何額外空間,自然就不能使用這種尋常的方法了;這裡可以有兩種方法來實現。
方法一
int x = 5;
int y = 10;
x = x + y;
y = x - y;
x = x - y;
先將兩個數之和附給x,接著x-y自然就是原本x的值,這時候賦值給y,y就拿到了x原本的值。此時x依然是兩個數之和,再進行x-y自然就是原本x的值。
這種方法比較直觀,也好理解,但是可能存在溢位的情況。
方法二
int x = 5; int y = 10; x = x ^ y; y = x ^ y; x = x ^ y;
第二種方法利用了異或運算的性質:
- 相同的兩個數異或結果為0
- 任何數與0異或結果還是其自身
- 異或運算滿足交換律和結合律
於是將x^y的結果賦予x,接著再將x與y異或,此時y的值就是x^y^y = x^(y^y) = x
,也就是說y拿到了x原本的值。
此時x依然是兩數異或的結果,而y是x原本的值,接著進行x^y就等同於x^y^x = y
, 於是x就拿到了y原本的值。
這種方法很巧妙,也不太好理解,但是不存在溢位的情況。
相關推薦
不佔用任何額外空間的情況下交換兩個數的值
題目 假如有x、y兩個數,如何在不佔用任何額外空間的情況下交換兩個數的值? 思路 平時我們在交換兩個數的值時,往往會用一箇中間數temp來實現效果,現在需要不佔用任何額外空間,自然就不能使用這種尋常的方法了;這裡可以有兩種方法來實現。 方法一 int x = 5; int y = 10; x = x
不借助第三個變量交換兩個數值類型變量的值
blog 數值 csdn 交換 tails 其中 簡單的 簡單 div 原文地址:http://blog.csdn.net/web_hwg/article/details/75045689 方法一 最簡單的方法是用一個臨時變量 var a = 10, b = 20; va
一道簡單的演算法題:不借助第三變數來交換兩個變數的值
今天做筆試碰到一道簡單的演算法題:不借助第三變數來交換兩個變數的值,記錄一下。 交換兩個變數的值的普遍做法都是藉助第三變數,這樣具有較高的可讀性。 a = 3 b = 5 t = a a = b b = t 但是,如果記憶體有限,只允許用2個變數呢? 強大的CS當然有辦法解決
不允許建立臨時變數,交換兩個數值
#include <stdio.h> #include<stdlib.h> void main() { int a = 1; int b = 2; printf("a=%d,b=%d\n", a, b); a = a + b; b = a - b; //
不適用 其他的變數交換兩個數值
#include<stdio.h> #include <stdlib.h> void swap1(int& a,int& b) //使用中間變數交換兩個值 { int temp = a; a = b;
不用中間變量交換兩個數值變量的值
mov 匯編 容易 運算 多次 對數 約束 本質 可能 第一類方法也是常用的方法,通過多次的數值計算來完成交換,到現在知道的有下面三種: (1)加減法。 a = a + b; b = a - b; a = a - b; 該方法可以交換整型和浮點
交換兩個數值的問題
(1) # include<stdio.h>void Swap_err1(int a , int b) { int tmp; tmp = a; a = b; b = tmp; } int main() { int a = 10;
交換兩個數值的幾種方法
public class Remainder{ public static void main(String [] args){ /* 交換兩個數值 */ //使用臨時變數 i
如何在不介入第三個變量的情況下實現兩個數的交換
16px bsp file 相同 rate cli 交換 ron eclips 如何在不介入第三個變量的情況下實現兩個數的交換: 1 package myeclipseFiles2; 2 3 public class Operator { 4 5 pu
編輯器拓展七——不實例化的情況下修改Assets下面的文件
如果 ica 文件 () pan 通過 個數 material spec 描述 1.今天接了個任務,因為公司的項目展示界面的人物與武器都用了standard與standard(specular steup),這個兩個自帶的材質球是帶霧效的,然後收到場景的影響 在ui界面
C# 不安裝Oracle客戶端情況下,如何連接到Oracle數據庫
是不是 如何 () 需要 -s 找到 密碼 dex add 簡介: 在我們開發應用場景經常碰到需要連接Oracle數據庫,這也是相當常見的一種情況。一般.Net環境連接Oracle數據庫,可以通過TNS/SQL.NET 配置文件,而 TNS 必須要 Oracle 客戶端
在不修改代碼的情況下無限擴展應用項目
blog 自動搜索 自然 如何實現 frame 接口規範 行合並 article 而不是 在許多需要分模塊開發,較為復雜的應用項目(如ERP之類)中,如何做到輕松擴展,往往是一個頭疼的問題。 在傳統條件下,我們會把各個功能分布在不同的類庫中,每添加一個功能就引用一個程序集
不停止kfaka服務的情況下修改kafka某個topic的數據保存時間
不停止kfaka服務的情況下修改kafk./kafka-topics.sh --zookeeper zk1:2181 -topic topicname --alter --config retention.ms=86400不停止kfaka服務的情況下修改kafka某個topic的數據保存時間
實現網頁不刷新頁面的情況下動態刷新表格數據
erp err enter ase null src void 情況 net <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix=
在不使用U盤的情況下使用wubi.exe程序在Win7上安裝ubuntu-14.04.3版系統
32bit baidu 結束 ubunt win7 查找 過程 解決 解決問題 本文介紹如何在不使用U盤的情況下使用wubi.exe程序在Win7上安裝ubuntu-14.04.3版系統。 花了一天的時間終於安裝上了Ubuntu14.04,過程坎坷,是血淚史,開始報
輸入輸出流讀取本機txt文件:不能將中文字元流轉化為char 因為char一個位元組,中文在UTF-8的情況下是三個位元組,會出現字元流擷取
package interview; import org.junit.Test; import java.io.*; public class TestInOrOutStream { class m { @Test void x(){ Sys
如何在不使用遞迴的情況下遍歷一棵二杈樹
如何在不使用遞迴的情況下遍歷一棵二杈樹 使用工具:迴圈 + 棧; 其實遞迴也是使用了記憶體中的棧。 思想如下: 對左節點依次做, 入棧 直到一個節點不存在左孩子時,出棧 出棧後,看其是否存在右孩子, 不存在,繼續出棧 存在,則將其右孩子,入棧 …… 如此迴圈。 示例程
如何在不重啟 JVM 的情況下重新載入證書檔案?
某種情況下需要動態下載證書檔案後使用 SSL 訪問某服務,但由於 JVM 使用預設的證書訪問新服務,該證書在 JVM 啟動的時候載入,那時還沒有新服務的證書,所以會報 ValidatorException,詳情: 16:44:27,338 ERROR [Htt
Java 在不知道Array長度的情況下 動態構造String Array
問題:在不知道Array長度的情況下 動態構造String Array 解決方案: 使用ArrayList: List<String> myList = new ArrayList<String>(); 在最後使用: &
MYSQL 索引型別、什麼情況下用不上索引、什麼情況下不推薦使用索引
mysql explain的使用: 索引型別 在資料庫表中,對欄位建立索引可以大大提高查詢速度。假如我們建立了一個 mytable表 程式碼如下: CREATE TABLE mytable( ID INT NOT NULL, username