剑指offer21----数组中奇数偶数】的更多相关文章

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 基本实现 如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有的数字往前面挪动一位.挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位.由于没碰到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O(n2).但是,这种方法不能让面试官满意.不过如果我们在听到题目之后马上能够说出这个解法,面试官至…
136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solution { public: int singleNumber(vector<int>& nums) { if(nums.empty()) ; ; ;i < nums.size();i++) res ^= nums[i]; return res; } }; 137. Single N…
package Problem14; /* * 问题描述: * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位与数组的前半部分,所有偶数位与数组的 * 后半部分 */ public class ReorderOddEven { public static void reOrder(int array[]) { int firstIndex = 0; int lastIndex = array.length - 1; if (array == null || (0 == a…
题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 分析: 数组中一共有偶数个数.两个数字只出现过一次. 相同数异或在一起等于0,那么将所有数异或最后结果就是只出现过一次的数异或在一起的结果. 那么我们找到结果中的某一位的bit位为1,将整个数组按照该位为0和1分成两组, 肯定可以分成两组,因为如果没有0组的话,那么数组就只可能有奇数个数:没有1组的话,那么结果不可能得到该位为1. 两组内分别进行异或,得到两个结果,这两个结果就是只出现过一次…
蛮力: 遍历数组,对每个元素都往前遍历所有元素,如果有发现比它小的元素,就count++. 最后返回count取模. 结果没问题,但超时哈哈哈,只能过50%.   归并法: 看讨论,知道了这道题的经典做法应该是用归并的思想,之所以用归并,是因为像上面我们直接比较a[i]后面的所有元素的话,肯定是O(n^2)的,那么就先考虑它旁边周围的元素,然后就归并了.   好像之前也就写过归并的伪代码,所以我看了下大概思路,然后就开始写了,一开始是每次mergeSort方法里面,就要递归用的那个方法里面,都n…
数组中的重复数字 题目描述 牛课网链接 长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 7 的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字 2 或者 3.(牛课网这里弄成「那么对应的输出是第一个重复的数字 2」了) A 简单实现思路 借助外部数组 b,原数组中的数字记为外部数组的下标,外部数组的值来存储这个数字出现的次数.原数组中…
在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. 思路:1.暴力法:直接遍历一遍,使用哈希map存储元素,然后找到第一个value值大于1的元素. 2.非常巧妙的方法,剑指offer书上. 1.判断输入数组有无元素非法 2.从头扫到尾,只要当前元素值与下标不同,就做一次判断,num…
题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 输入:nums = [4,1,4,6] 输出:[1,6] 或 [6,1] 其实看到他要求的空间复杂度为O(1)代表不能使用类似于HashMap这种数据结构的解法了,我当时也有点懵比,那要怎么做呢?想了半天还是看看评论区大神的解题思路吧. 思路 在做这道题之前你需要知道 异或运算符的性质.也就是^: 异或:相同为0,不同为1 举个例子:3 ^…
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.   思路: 因为有2个数字只出现了一次,而其他的数字都是2次,可以通过异或运算,得到最后这2个只出现一次的数字的 异或结果值.这种值必然不为0. 然后找出这个数字二进制中,最低位为1的位数,必然那一位一个是0,一个是1. 通过这个条件将原数组分为2部分,分别异或,得到结果.   代码: class Solution { public: void FindNumsAppearOnce(vecto…
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.     分析:利用归并排序的思想,分成2部分,每一部分按照从大到小排序,然后比较左侧的a[i]和右侧的b[j]   若a[i]>b[j],那么a[j]大于b[j]~b[right], 产生 right-j+1 组逆序对. 若a[j]<=b[j],不产生逆序对.   同时更新数组的从left到right部分,实现其从大到小排序,然后在拿排序号的数组和更大的数组进…