【Java】 剑指offer(21) 表示数值的字符串
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【Java】 剑指offer(21) 表示数值的字符串,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3765字,纯文字阅读大概需要6分钟。
内容图文
![【Java】 剑指offer(21) 表示数值的字符串](/upload/InfoBanner/zyjiaocheng/852/ac3c065a6b184bf0acd61376e2f865ee.jpg)
本文参考自《剑指offer》一书,代码采用Java语言。
题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
思路
对于任意一个整数数组,设置一个指针,从前往后走,如果遇到奇数则指针后移,遇到偶数时,希望把该偶数放在数组后面;因此,再设置一个指针,从后往前走,遇到偶数时指针前移,遇到奇数时,则恰好可以与前面的指针所指的偶数进行调换。
测试算例
1.功能测试(数组中奇偶数交替出现;数组中先奇数后偶数;数组中先偶数后奇数)
2.特殊测试(null,空数组,一个数据的数组)
完整Java代码
(含测试代码)
package _21; import java.util.Arrays; /** * * @Description 调整数组顺序使奇数位于偶数前面 * * @author yongh * @date 2018年10月11日 上午10:12:01 */ //题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有 //奇数位于数组的前半部分,所有偶数位于数组的后半部分。 public class ReorderArray { public void reOrderArray(int [] array) { if(array==null || array.length==0) return; int length = array.length; int low=0; int high=length-1; int temp; while(low<high){ //向后移动low指针,直到它指向偶数 while(low<length && (array[low]&1)!=0) low++; //向前移动high指针,直到它指向奇数 while(high>=0 && (array[high]&1)==0) high--; if(low<high){ temp=array[low]; array[low]=array[high]; array[high]=temp; } } } //===============测试代码=================== void test1() { int[] array = null; System.out.println("原始数组:"+Arrays.toString(array)); reOrderArray(array); System.out.println("调整结果:"+Arrays.toString(array)); System.out.println(); } void test2() { int[] array = {}; System.out.println("原始数组:"+Arrays.toString(array)); reOrderArray(array); System.out.println("调整结果:"+Arrays.toString(array)); System.out.println(); } void test3() { int[] array = {-2,4,-6,1,-3,5}; System.out.println("原始数组:"+Arrays.toString(array)); reOrderArray(array); System.out.println("调整结果:"+Arrays.toString(array)); System.out.println(); } void test4() { int[] array = {-1,3,-5,2,-4,6}; System.out.println("原始数组:"+Arrays.toString(array)); reOrderArray(array); System.out.println("调整结果:"+Arrays.toString(array)); System.out.println(); } void test5() { int[] array = {-1,2,-3,4,-5,6}; System.out.println("原始数组:"+Arrays.toString(array)); reOrderArray(array); System.out.println("调整结果:"+Arrays.toString(array)); System.out.println(); } void test6() { int[] array = {2,2,1,3,4,1}; System.out.println("原始数组:"+Arrays.toString(array)); reOrderArray(array); System.out.println("调整结果:"+Arrays.toString(array)); System.out.println(); } void test7() { int[] array = {1}; System.out.println("原始数组:"+Arrays.toString(array)); reOrderArray(array); System.out.println("调整结果:"+Arrays.toString(array)); System.out.println(); } public static void main(String[] args) { ReorderArray demo = new ReorderArray(); demo.test1(); demo.test2(); demo.test3(); demo.test4(); demo.test5(); demo.test6(); demo.test7(); } }
![【Java】 剑指offer(21) 表示数值的字符串 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506042515752.jpg)
![【Java】 剑指offer(21) 表示数值的字符串 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506042515858.jpg)
test1 passed! test2 passed! test3 passed! test4 passed! test5 passed! test6 passed!ReorderArray
附加要求
如果题目附加要求:保证调整后的数组中,奇数和奇数之间,偶数和偶数之间的相对位置不变。
此时用上面的方法就没法实现该功能,可以采用类似于“直接插入排序”的方法:从头开始遍历,遇到奇数时,将该奇数插入到该奇数前面的偶数之前。(如:从头开始遍历246183,遇到奇数1时,将1插入到246之前,变为:124683;该插入的实质是:奇数前面的所有偶数往后移一位,空出的位置放入该奇数),具体实现方法见下面的代码:
/* * 附加要求:保证调整后的数组中,奇数和奇数之间,偶数和偶数之间的相对位置不变。 * 采用类似直接插入排序算法 */ public void reOrderArray2(int [] array) { if(array==null || array.length==0) return; int length = array.length; int temp,j; for(int i=1;i<length;i++) { if((array[i]&1)!=0) { j=i; temp=array[j]; while((j>0)&&(array[j-1]&1)==0) { array[j]=array[j-1]; j--; } array[j]=temp; } } }
收获
学会灵活应用指针。
内容总结
以上是互联网集市为您收集整理的【Java】 剑指offer(21) 表示数值的字符串全部内容,希望文章能够帮你解决【Java】 剑指offer(21) 表示数值的字符串所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。