空间复杂度为1的从右向左显示


    public void doTest(View view){
        String TAG = "kodulf";

//        请给出算法,要求空间复杂度为1
//        部分国家是从右向做阅读的,要求给出算法,将下面的message 转化为从右向左的
//        例如:"hello world" 就转为 "world hello"
//        例如:"are you ok" 就转为"ok you are"

        char[] message = {'h','e','l','l','o',' ','w','o','r','l','d'};
        char[] message2 = {'a','r','e',' ','y','o','u',' ','o','k'};


        test(message);
        Log.d(TAG,"message :" + new String(message));


        test(message2);
        Log.d(TAG,"message2 :" + new String(message2));
    }

    public void test(char[] message){
        String TAG = "kodulf";
        int length = message.length;
        //1:先整体调换
        reverse(message,0,message.length-1);

        int start = 0;

        for (int i = 0; i < message.length; i++) {
            if (message[i]== ' '){
                Log.d(TAG,"message-mid : " + "start = " +start + " i = " + i);
                reverse(message,start,i-1);
                Log.d(TAG,"message-mid :" + new String(message) + "start = " +start);
                start = i+1;
                Log.d(TAG,"message-mid :" + "start = " +start);
            }
        }
    }

    public void reverse(char[] message, int start, int end){
        String TAG = "kodulf";
        Log.d(TAG,"reverse :" + "start = " +start + " end =  "+ end + " message = " +new String(message));
        char temp;
        for (int i = start; i <=((start+end)/2); i++) {
            temp = message[i];
            //这里这一步很重要就是要+start,否则中间的一些单纯就会有问题,因为例如3,5之间,如果直接end-i就是5-3 = 2了。
            message[i] = message[end -i + start];
            message[end -i + start] = temp;
        }
    }

豆包给出的:

public class ReverseWordsInArray {
    public static void reverseWords(char[] message) {
        // 先整体反转字符数组
        reverse(message, 0, message.length - 1);

        int start = 0;
        int end;
        // 再逐个反转每个单词
        while (start < message.length) {
            end = start;
            while (end < message.length && message[end]!= ' ') {
                end++;
            }
            reverse(message, start, end - 1);
            start = end + 1;
        }
    }

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

    public static void main(String[] args) {
        char[] message1 = {'h','e','l','l','o',' ','w','o','r','l','d'};
        reverseWords(message1);
        System.out.println(new String(message1));

        char[] message2 = {'a','r','e',' ','y','o','u',' ','o','k'};
        reverseWords(message2);
        System.out.println(new String(message2));
    }
}
这个算法首先整体反转整个字符数组,然后逐个反转每个单词,从而实现将字符串从左向右的顺序转换为从右向左的顺序,且空间复杂度为 O (1),只使用了有限的额外变量,不随输入规模的增加而增加额外的空间需求。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值