这是一个我面试某公司的算法题目:对一个字符数组进行排序,根据给定的字符,大于它的,放在数组的左边,小于它的,放在数组的右边,且数组中的元素之间的相对位置要保持不变。
2013-01-24 11:46
781 查看
这个题目面试的时候,用的是最简单,但多开辟内存的方法,后来自己想想,在原数组进行操作的方法:
private static string GreaterLeftLessRight(string str, char c) { char[] array = str.ToCharArray(); int comparingIndex = str.IndexOf(c); int i = 0; int j = comparingIndex + 1; int lastExchangePositionInLeft = -1; int lastExchangePositionInRight = -1; int rightestIndex = comparingIndex; char tmp; while (i < comparingIndex || j < array.Length) { int shouldExchangeInLeft = -1; int shouldExchangeInRight = -1; while (i < comparingIndex) { if (array[i] < c) { shouldExchangeInLeft = i; i++; break; } else { i++; } } while (j < array.Length) { if (array[j] >= c) { shouldExchangeInRight = j; j++; break; } else { j++; } } if (shouldExchangeInLeft != -1 && shouldExchangeInRight != -1 && array[shouldExchangeInRight] != c) { ExchangeCharacterInArray(array, shouldExchangeInLeft, shouldExchangeInRight); lastExchangePositionInLeft = shouldExchangeInLeft; lastExchangePositionInRight = shouldExchangeInRight; } else if (shouldExchangeInLeft != -1 && shouldExchangeInRight == -1) { tmp = array[shouldExchangeInLeft]; int moveEndIndex = lastExchangePositionInRight == -1 ? array.Length - 1 : lastExchangePositionInRight; MoveCharacterInArray(array, shouldExchangeInLeft, moveEndIndex, tmp); i--; comparingIndex--; } else if (shouldExchangeInLeft != -1 && array[shouldExchangeInRight] == c) { array[shouldExchangeInRight] = array[shouldExchangeInLeft]; MoveCharacterInArray(array, shouldExchangeInLeft, rightestIndex, c); i--; comparingIndex--; } else if (shouldExchangeInLeft == -1 && shouldExchangeInRight != -1 && array[shouldExchangeInRight] != c) { tmp = array[shouldExchangeInRight]; MoveCharacterInArray(array, shouldExchangeInRight, comparingIndex, tmp); comparingIndex++; rightestIndex = comparingIndex; } else if (shouldExchangeInLeft == -1 && shouldExchangeInRight != -1 && array[shouldExchangeInRight] == c) { int moveEndIndex = rightestIndex + 1; MoveCharacterInArray(array, shouldExchangeInRight, moveEndIndex, c); rightestIndex = moveEndIndex; } } return new string(array); } private static void MoveCharacterInArray(char[] array, int startIndex, int endIndex, char endCharacter) { if (startIndex == endIndex) { return; } else if (startIndex < endIndex) { for (int k = startIndex; k < endIndex; k++) { array[k] = array[k + 1]; } array[endIndex] = endCharacter; } else { for (int k = startIndex; k > endIndex; k--) { array[k] = array[k - 1]; } array[endIndex] = endCharacter; } } private static void ExchangeCharacterInArray(char[] array, int leftPosition, int rightPosition) { char tmp = array[leftPosition]; array[leftPosition] = array[rightPosition]; array[rightPosition] = tmp; }
相关文章推荐
- 给定一个无序数组,请调整该数组,调整成奇数放在数组的左边,偶数放在数组的右边。但是奇数与奇数之间的相对顺序不变,偶数和偶数之间的相对顺序也不变。
- 腾讯2017年实习生编程题目(第二题)----2.算法基础-字符移位 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
- 据说是淘宝面试题“给定一个数组将大于0的放在最右边,等于0的放在中间,大于0的放在最左边”
- 将一个数组中所有的奇数放左边,偶数放右边,且原来数字的相对位置不变
- 剑指offer题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 【原创】将一个数组中的0元素全部排到数组的右边,其他元素相对顺序保持不变。
- [面试算法]把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。
- 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 给定一个int数组A,同时给定
- 【大家来一起讨论吧】百度面试题,假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求:o(n),o(1)
- 20100127_1 设一维数组V中存有N个整数,试写一个算法,将其中的非零元素移到数组的前面来,连续存放,相对位置不变。
- 给定一个数组nums,写一个函数将所有的值移动0到最后,同时保持非零元素的相对顺序不变
- 已知一个整数数组A[n],写出算法实现将奇数元素放在数组的左边,将偶数放在数组的右边。要求时间复杂度为O(n)。
- 已知某公司总人数为W,平均年龄为Y岁(每年3月末计算,同时每年3月初入职新人),假设每年离职率为x,x>0&&x<1,每年保持所有员工总数不变进行招聘,新员工平均年龄21岁。 从今年3月末开始,请实现一个算法,可以计算出第N年后公司员工的平均年龄。(最后结果向上取整)。
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 面试--求数组,左边的数都小于等于它,右边的数都大于等于它
- 那些年我们刷过的算法题(排序)---有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序
- 【每天一道算法题】给定一个存放整数的数组,要求数组左边为奇数,右边为偶数
- 个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出
- 题目1516:调整数组顺序使奇数位于偶数前面,并保证奇数和奇数,偶数和偶数之间的相对位置不变
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。