面试题——找出1000个连续数中出现的一个重复数

在一次ipad开发公司的面试中,遇到一个问题:如何找出1000个乱序的连续数(1-999)中的一个重复数?最初的解决方案是使用额外的数组标记,但后来发现可以优化为仅用原数组进行交换。通过遍历和交换,当找到数的位置不等于其值时,进行一系列替换操作,直至找到重复数。这种方法降低了空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前些天去面试一家做ipad开发的公司,第一道题是找出1000个数(1-999)中一个重复的数。这1000个数是连续且乱序的。我的第一反应就是创建一个999的数组,然后根据数字找相应的数组下标,如果对应的为空则填充,如果有值则找到了重复的数。python版的解法如下:

 

# 创建测试数据,1000个数,随机排序,为了简单用了0-999

 

# 使用数组的方式查找

 

 

该方法是时间复杂度最低的,但是空间复杂最高。面试过后才想明白其实存储那1000个数的数组(这里是lst)本身就是存储空间,我无须再创建一个临时的1000数组。只要创建一个用于保存临时交换数字的空间就可以了。解题思路还和上面一样,按照数字与数组下标的对应关系,来填充到相应位置。只是每一次填充过程都是一个系列替换过程,比如[2,1,3,0]这样的数组,拿到第一个数字式2,则将[2]中的3保存到临时变量中,然后[2]=2,然后再将[3]中的0保存在临时变量中[3]=3,然后将[

### JavaScript 面试常见算法题汇总 在 JavaScript 的面试过程中,算法题目通常会涉及组操作、字符串处理、对象管理以及一些经典的计算机科学问题。以下是几类常见的算法题目及其解决思路: #### 组与字符串操作 1. **两之和** 给定一个组 `nums` 和一个目标值 `target`,请你在该组中找出和为目标值的两个,并返回它们的组下标[^2]。 ```javascript function twoSum(nums, target) { const map = new Map(); for (let i = 0; i < nums.length; i++) { let complement = target - nums[i]; if (map.has(complement)) { return [map.get(complement), i]; } map.set(nums[i], i); } return []; } ``` 2. **最长无复子串** 给定一个字符串,请找到其中最长的不含复字符的子串长度。 ```javascript function lengthOfLongestSubstring(s) { const set = new Set(); let maxLength = 0; let left = 0; for (let right = 0; right < s.length; right++) { while (set.has(s[right])) { set.delete(s[left]); left++; } set.add(s[right]); maxLength = Math.max(maxLength, right - left + 1); } return maxLength; } ``` #### 排序与搜索 3. **快速排序实现** 实现一种高效的排序算法——快速排序。 ```javascript function quickSort(arr) { if (arr.length <= 1) return arr; const pivot = arr[Math.floor(arr.length / 2)]; const left = [], middle = [], right = []; for (const num of arr) { if (num < pivot) left.push(num); else if (num === pivot) middle.push(num); else right.push(num); } return [...quickSort(left), ...middle, ...quickSort(right)]; } ``` 4. **二分查找** 在有序组中查找某个特定元素的位置。 ```javascript function binarySearch(arr, target) { let left = 0, right = arr.length - 1; while (left <= right) { const mid = Math.floor((left + right) / 2); if (arr[mid] === target) return mid; if (arr[mid] < target) left = mid + 1; else right = mid - 1; } return -1; } ``` #### 动态规划 5. **爬楼梯问题** 假设你正在爬楼梯,每次你可以爬一阶或者两阶,请计算到达顶部的方法总。 ```javascript function climbStairs(n) { if (n <= 2) return n; let prev1 = 1, prev2 = 2; for (let i = 3; i <= n; i++) { const current = prev1 + prev2; prev1 = prev2; prev2 = current; } return prev2; } ``` 6. **最大子序列和** 找到给定组中的连续子组的最大和。 ```javascript function
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值