调整数组顺序使奇数位于偶数前面&&链表中倒数第k个结点

调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解题思路

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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值