字符串翻转算法-JAVA

单词翻转

问题描述:

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如,输入“I am a student.”,则输出“student. a am I”。

算法分析

首先第一步反转.tneduts a ma I,然后以空格为界,逐个单词反转,最后输出student. a am I,时间复杂度O(n),空间复杂度O(1)

Java代码

/**
 * Created by billJiang on 2016/10/21.
 */
public class TestReverseString {

    public static void main(String[] args) {
        String str="I am a student.";
        char[] chars=str.toCharArray();

        //first reverse
        reverse(chars,0,chars.length-1);
        System.out.println(String.valueOf(chars));

        //second reverse
        int start=0,end;
        for (int i = 0; i <chars.length ; i++) {
            if(chars[i]==' '){
                end=i-1;
                reverse(chars,start,end);
                start=i+1;
            }else if(i==chars.length-1){
                reverse(chars,start,i);
            }
        }
        System.out.println(String.valueOf(chars));
    }

    public static void reverse(char[] chars,int start,int end){
        while(start<end){
            char temp=chars[start];
            chars[start++]=chars[end];
            chars[end--]=temp;
        }
    }
}

链表翻转

问题描述

给出一个链表和一个数k,比如,链表为1→2→3→4→5→6,
若k=2,翻转后 2→1→6→5→4→3,
若k=3,翻转后 3→2→1→6→5→4,
若k=4,翻转后 4→3→2→1→6→5,
用程序实现

算法分析

以第k-1个数字为界,拆分两部分,分别反转,时间复杂度O(n),空间复杂度O(1)

Java代码

以数组形式来表示链表

重新排序方式

import java.util.Scanner;

/**
 * Created by billJiang on 2016/10/20.
 */
public class TestLinkListReverse {
    public static void main(String[] args) {
        int[] num = {1, 2, 3, 4, 5, 6};
        System.out.println("Enter a number(1-6):");
        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();
        if(k>num.length||k<1) {
            System.out.println("invalid number");
            return;
        }
        reverseArr(num,0,k-1);
        reverseArr(num,k,num.length-1);

        //result output
        for (int i = 0; i <num.length ; i++) {
            if(i<num.length-1)
                System.out.print(num[i]+"->");
            else
                System.out.print(num[i]);
        }

    }

    public static int[] reverseArr(int[] num,int start,int end){
        while(start<end){
            int temp=num[start];
            num[start++]=num[end];
            num[end--]=temp;
        }
        return num;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值