重新排列数组,使得负数后面跟着正数,O(1)的空间

两种情况:可以打乱原始顺序;不可以打乱原始顺序

下面代码未测试,只是build了一下

 1 /*************************************************************************
 2     > File Name: RearrangeArray.cpp
 3     > Author: zhoukang1991
 4     > Mail: [email protected]
 5     > Created Time: 2014年08月28日 星期四 21时50分54秒
 6  ************************************************************************/
 7
 8 #include <iostream>
 9 #include <vector>
10 #include <algorithm>
11 using namespace std;
12
13 //keep the original sequence
14 //类似于插入排序,不过是从左到右处理每次找到不满组
15 //条件的就往后寻找满足的,并且数组右移
16 void rightrotate(vector<int> &arr,int outofplace,int cur){
17     int tmp = arr[cur];
18     for(int i = cur ; i > outofplace ; --i){
19         arr[i] = arr[i-1];
20     }
21     arr[outofplace] = tmp;
22 }
23
24 void rearrangeArray_1(vector<int> &arr){
25     int n = arr.size();
26     int outofplace = -1;
27     for(int i = 0 ; i < n ; ++i){
28         if(outofplace >= 0){
29             if(((arr[i] >= 0) && (arr[outofplace] < 0)) || ((arr[i]<0)&&(arr[outofplace]>=0))){
30                 rightrotate(arr,outofplace,i);
31                 if(i-outofplace > 2){
32                     outofplace = outofplace+2;
33                 }
34                 else{
35                     outofplace = -1;
36                 }
37             }
38         }
39         if(outofplace == -1){
40             if(((arr[i] >= 0)&&(!(i&0x01)))||((arr[i] < 0)&&(i & 0x01))){
41                 outofplace = i;
42             }
43         }
44     }
45 }
46
47 //不需要保持原来顺序
48 //类似于快速排序:两个指针从前往后开始遍历,不满足条件的就交换
49 int check(int v,int id){
50     if((v >= 0)&&(!(id & 0x01))){
51         return 1;
52     }
53     else if((v < 0) && (!(id & 0x01))){
54         return -1;
55     }
56     return 0;
57 }
58 void rearrange_2(vector<int> &arr){
59     int n = arr.size();
60     int left,right;
61     while(left < n && right < n){
62         for(;left < n ; ++left){
63             if(check(arr[left],left) == 1){
64                 break;
65             }
66         }
67         for(;right < n ; ++right){
68             if(check(arr[right],right) == -1){
69                 break;
70             }
71         }
72         swap(arr[left],arr[right]);
73         left++;
74         right++;
75     }
76 }
77
78 int main(){
79     return 0;
80 }
时间: 2024-10-05 19:05:33

重新排列数组,使得负数后面跟着正数,O(1)的空间的相关文章

一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的 相对顺序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1) 。

#include <iostream> using namespace std; void mSort(int *arr, int iLen) { int i, j, k, tmp; for(i = 0, j = 0; i < iLen; i++) { if (arr[i] < 0) { tmp = arr[i]; for(k = i; k > j; k--) arr[k] = arr[k - 1]; arr[j++] = tmp; } } } int main() { in

使用array_merge重新排列数组下标

array_merge() 函数把两个或多个数组合并为一个数组. 如果键名有重复,该键的键值为最后一个键名对应的值(后面的覆盖前面的).如果数组是数字索引的,则键名会以连续方式重新索引. 注释:如果仅仅向 array_merge() 函数输入了一个数组,且键名是整数,则该函数将返回带有整数键名的新数组,其键名以 0 开始进行重新索引. 使用array_merge重新排列数组下标

【C语言】将正数转成负数,将负数转成正数

//将正数转成负数,将负数转成正数 #include <stdio.h> int change(int num) { if (num < 0) { num = ~(num - 1); } else if (num >0) { num = ~num + 1; } return num; } int main() { printf("%d\n", change(5)); printf("%d\n", change(-5)); printf(&qu

求数组(元素可为正数、负数、0)的最大子序列和。

int max_sum(int *arr,int len) { assert(arr); assert(len > 0); int sum=0; int key=-INT_MAX; for(int i=0; i<len; ++i) { if(sum <= 0) sum=arr[i]; else sum+=arr[i]; if(sum >= key) key=sum; } return key; }

为什么改了JS数组中的一个元素的值,其他数组元素值都跟着变了

原因: 数组是引用类型,数组变量存储在栈,元素数据存储在堆中,将数组赋值不同的对象,所以的赋值对象都指向堆同一个数据,所以改变其中一个数组中的元素,别的数组元素也会改变. 解决方案: 原理就是先把数组转换成字符串再转换成对象 ,这样会新分配一块内存,就不会指向同一个堆中的数据.  例子1: var tmp = JSON.parse(JSON.stringify(array)); 原文地址:https://www.cnblogs.com/KevinTong/p/11414770.html

javascript reverse()反序排列数组中的元素

javascript reverse()可以颠倒数组中元素的顺序,该方法会改变原来的数组,而不会创建新的数组 <!DOCTYPE html> <html> <head> <title>Runde</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="tex

剑指offer-字符串的排列-数组-递归-动态规划-python

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. class Solution: def Permutation(self, ss): if len(ss) <= 1: return ss res = set() # 遍历字符串,固定第一个元素,第一个元素可以取a,b,c...,

用冒泡排序排列数组中的数字,并按一定顺序输出结果

#include<stdio.h>int main(){ int arr[10] = { 0 }; int i = 0; int j = 0; for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {  scanf("%d", &arr[i]); } for (i = sizeof(arr) / sizeof(arr[0]); i > 0; i--) {  for (j = 0; j < i - 1;

[CareerCup] 17.6 Sort Array 排列数组

17.6 Given an array of integers, write a method to find indices m and n such that if you sorted elements m through n, the entire array would be sorted. Minimize n - m (that is, find the smallest such sequence).