调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路
1.将数组的奇数与偶数分开重组,因为不知道奇数与偶数的个数,所以不建议新建数组与String来存放奇数与偶数。通过链表与StringBuffer来实现。
2,第一种的方法缺点是需要重新开辟空间存放,可以使用类似冒泡的思想,将奇数进行“冒泡”,进行奇偶数的分开
代码
/**
* 剑指offer一刷:调整数组顺序使奇数位于偶数前面
*
* @author User
* @create 2019-05-15-16:59
*/
public class jzo13 {
public void reOrderArray(int [] array) {
//数组的重组联想到StringBuffer,不是String
// int n=array.length;
// StringBuffer stringA=new StringBuffer();
// StringBuffer stringB=new StringBuffer();
// for(int i=0;i<n;i++){
// if(array[i]%2==1){
// stringA=stringA.append(array[i]); //奇数
// }else{
// stringB=stringB.append(array[i]); //偶数
// }
// }
// String newString=stringA.append(stringB).toString();
// System.out.println(newString);
//=============================================================//
// int n=array.length;
// List<Integer> listA=new ArrayList<>();
// List<Integer> listB=new ArrayList<>();
// for(int i=0;i<n;i++){
// if(array[i]%2==1){
// listA.add(array[i]);
// }else{
// listB.add(array[i]);
// }
// }
// Object[] newArray1=listA.toArray();
// Object[] newArray2=listB.toArray();
// int[] newArray=new int[n];
// for(int j=0;j<newArray1.length;j++){
// newArray[j]=(int)newArray1[j];
// }
// for(int k=0;k<newArray2.length;k++){
// newArray[newArray1.length+k]=(int)newArray2[k];
// }
// for(int h=0;h<n;h++){
// System.out.println(newArray[h]);
// }
//=====================================================
for(int i= 0;i<array.length-1;i++){
for(int j=0;j<array.length-1-i;j++){
if(array[j]%2==0&&array[j+1]%2==1){
int t = array[j];
array[j]=array[j+1];
array[j+1]=t;
}
}
}
}
public static void main(String[] args){
jzo13 re=new jzo13();
int[] array=new int[]{1,2,3,4,5,6,7,8};
re.reOrderArray(array);
}
}
链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。
解题思路
见两个指针,第一个先走k步,然后两个指针一起出发,当第一个指针走到最后,第二个指针刚好走到倒数第k个位置(第一个指针和第二个指针相隔k步),返回第二个指针的值。
代码
package offer.bin.first;
/**
* 剑指offer一刷:调整数组顺序使奇数位于偶数前面
*
* @author User
* @create 2019-05-16-20:43
*/
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class jzo14 {
private static ListNode FindKthToTail(ListNode head,int k) {
ListNode preNode=head;
ListNode lastNode=head;
//preNode先走k个长度
for(int i=0;i<k;i++){
if(preNode!=null){
preNode=preNode.next;
}else {
return null;
}
}
while (preNode!=null){
preNode=preNode.next;
lastNode=lastNode.next;
}
return lastNode;
}
public static void main(String[] args){
ListNode node1=new ListNode(1);
ListNode node2=new ListNode(2);
ListNode node3=new ListNode(3);
ListNode node4=new ListNode(4);
ListNode node5=new ListNode(5);
ListNode node6=new ListNode(6);
ListNode node7=new ListNode(7);
node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=node5;
node5.next=node6;
node6.next=node7;
// System.out.println(jzo14.FindKthToTail(node1,2));
ListNode node=jzo14.FindKthToTail(node1,2);
System.out.println(node.val);
}
}