> **不用临时变量怎么实现两个数据的交换?**

方式一:加减法的运算方式求解
new_b = a - b + b = a;
new_a = a + b - a = b;
一个简单的运算方式,最重要的思路就是加减法运算的结合性,第一行代码很关键,a = a - b
```
//方式一:加减法运算
- (void)func2SwapA:(int)a B:(int)b{

a = a - b;
b = a + b;
a = b - a;
NSLog(@"%d,%d",a,b);
}
```

方式二:异或运算
看这代码可能比较绕,我再拆分一下
new_b = (a^b)^b = a^b^b = a^(b^b) = a^0 = a
new_a = (a^b)^a = a^b^a = a^a^b = (a^a)^b = 0^b = b
不难发现,异或有一个重要的规律就是:
x^x = 0,
0^x=x,
则可以推理出a^b^a=b
```
- (void)func1SwapA:(int)a B:(int)b{
a ^= b;
b ^= a;
a ^= b;
NSLog(@"%d,%d",a,b);
}
```

> **举一反三---——示例1**
> 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?

分析:其实关于异或运算有一个有趣的现象,假设函数f(n)是自然数1,2,3,...,n的所有数的异或,即f(n)=1^2^3^...^n, 那么,任意的n(n为自然数),我们能够很快的计算出f(n)的值。
```
if n == 4*m, then f(n) = n
else if n == 4*m + 1, then f(n) = 1
else if n == 4*m + 2, then f(n) = n+1
else n = 0
```
本题解题方法:我们可以先将1001个数进行异或,在与1-1000的异或进行异或。 这是利用异或运算符的基本性质,相同为0,相异为1。
即 x = (1001个数的异或)^ (1^2^3^...^1000)
相同元素异或之后是0,与重复的那个元素再异或,得到的就是重复的那个元素。

> **举一反三---——示例2**
> 有N个整数,除了其中的两个数只出现一次以外,其余的所有的数都正好出现两次,如何用最快的方法求出只出现一次的两个数,要求空间复杂度是O(1).(**这个题目的答案在下篇文章揭晓)**

关于时间复杂度和空间复杂度,可能很多同学不明白,下面做一个我的理解说明。

* **时间复杂度**
时间复杂度简单的理解就是执行语句的条数。如果有循环和递归,则忽略简单语句,直接算循环和递归的语句执行次数。
举个栗子~~不同时间复杂度的情况
1、 时间复杂度为O(1)
```
int x = 1;
```
2、时间复杂度为O(n)
```
for(int i=0; i<n; i++) {
System.out.println(i);
}
```
3、时间复杂度为O(log2n)
```
int n = 8, count = 0;;
for(int i=1; i<=n; i *= 2) {
count++;
}
```
4、 时间复杂度为O(n2)
```
int n = 8, count = 0;;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
count++;
}
}
```

* **空间复杂度**

空间复杂度也很简单的理解为临时变量占用的存储空间。一个简单例子:
```
//交换两个变量x和y
int x=1, y=2;
int temp = x;
x = y;
y = temp;
```
一个临时变量temp,所以空间复杂度为O(1)。

iOS面试必看经典试题分析的更多相关文章

  1. iOS面试必看

    转载:http://www.jianshu.com/p/5d2163640e26 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形 ...

  2. iOS面试必看,最全梳理

    序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...

  3. iOS,面试必看,最全梳理

    序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...

  4. 【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2

    原文网址:http://bbs.51cto.com/thread-1099956-1.html 亲爱的学员们: 如今,各路开发者为淘一桶金也纷纷转入iOS开发的行列.你心动了吗?想要行动吗?知道如何做 ...

  5. 学习ios(必看经典)牛人40天精通iOS开发的学习方法

    学习ios(必看经典)牛人40天精通iOS开发的学习方法 描述 这是一套从一个对iOS开发感兴趣的学员到iOS开发高手的系统.专业的课程体系.以培养企业开发真正需要的人才为目标,每个知识点都用案例来讲 ...

  6. 2019JS必看面试题

    2019JS必看面试题:https://www.jianshu.com/p/f1f39d5b2a2e 1. javascript的typeof返回哪些数据类型. 答案:string,boolean,n ...

  7. 面试必看!靠着这份字节和腾讯的面经,我成功拿下了offer!

    准备 敲定了方向和目标后就开始系统准备,主要分为以下几个方面来准备. 算法题 事先已经看过别人的社招面经知道头条每轮技术面都有算法题,而这一块平时练习的比较少,校招时刷的题也忘记了很多.因此系统复习的 ...

  8. 面试必看!凭借着这份 MySQL 高频面试题,我拿到了京东,字节的offer!

    前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面 ...

  9. 百度搜索 “Java面试题” 前200页(面试必看)

    前言 本文中的题目来源于网上的一篇文章<百度搜索 "Java面试题" 前200页>,但该文章里面只有题目,没有答案.因此,我整理了一些答案发布于本文.本文整理答案的原则 ...

随机推荐

  1. php 引入文件 include 和require

    php 如何引用文件? 先建一个php 文件,php文件名要和所建的类名相同, 然后直接在php 中用include("")/include"" 和requir ...

  2. (C#:Socket)简单的服务端与客户端通信。

    要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...

  3. C# 基础控制台程序的创建,输出,输入,定义变量,变量赋值,值覆盖,值拼接,值打印

    基础学习内容有 Console.WriteLine("要输出的内容");//往外输出内容的 Console.ReadLine(); //等待用户输入,按回车键结束,防止程序闪退 控 ...

  4. [hadoop] - Container [xxxx] is running beyond physical/virtual memory limits.

    当运行mapreduce的时候,有时候会出现异常信息,提示物理内存或者虚拟内存超出限制,默认情况下:虚拟内存是物理内存的2.1倍.异常信息类似如下: Container [pid=13026,cont ...

  5. 关于 <textarea ></textarea >标签在苹果微信浏览器出现 内阴影

    解决方法:(去除浏览器默认的样式元素) textarea  { box-shadow:0px 0px 0px rgba(0,0,0,0); -webkit-appearance:none; }

  6. 开源OSS.Social微信项目进阶介绍

    在开源OSS.Social微信项目解析的随笔中,我简单给大家分享了进行中微信项目的概要设计,主要在讲述解决思路和过程,没有详细实现和使用介绍.本着不能马虎的态度,这篇文章我来给大家分解一下项目结构,使 ...

  7. SQL SERVER 事务日志 解析

    1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录形式需要根据数据库的恢复模式来确定,数据库恢复模式有三种: 完整模式,完全记录事物日志,需要定期进行 ...

  8. 警惕一大波银行类木马正在靠近,新型BankBot木马解析

    背景 来自安全公司Dr.Web的研究人员说,最近一个未命名的Android银行木马源代码在地下黑客论坛遭到了泄露.就在近期,阿里聚安全检测到大量新型BankBot家族木马,木马伪装成Good Weat ...

  9. 如何快速的学习selenium工具

    分享即快乐. 最近几年,软件测试工程师一度成为热门职业,作为测试员也是倍感压力.作为测试员来说,仅仅会手工测试让职业生涯陷入瓶颈.于是工作之余充电,学习了自动化测试工具selenium,打算进阶中高级 ...

  10. 好公司、行业、领导?应届生应根据什么选offer?

    两个年轻人大学毕业了,一个去了收入更高的大企业工作,一个去了收入较低的小作坊式工厂工作.你们说他们谁的青春时光最能升值呢?表面上看应该是大企业,可是大企业是做马车制造的,小作坊是做汽车的.现在人们都知 ...