递归算法练习

题1
题目概述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

算法思路:
(1)方法一:通过迭代一半长度的数组,从初始位置开始到数组的一半,将头和尾的元素进行交换(这里可以使用临时变量的方法,先将元素值存储在临时变量上,然后进行交换),时间复杂度为O(n)

(2)方法二:使用递归的方法,定义两个指针,分别为left和right,然后递归遍历left和right使得left++、right–,直到left大于等于right时停止(当数组长度为奇数时边界条件是left=right,到数组长度为偶数时边界条件是left>right)

算法实现:
(1)迭代

/**
     * 迭代方法
     * @param s
     */
    public void reverseString(char[] s) {
        //奇数时中间那个不换,偶数时中间那两个换,为此条件表达式为<,可避免。
        for(int i = 0;i<s.length/2;i++){
            //定义一个临时变量用来存储
            char temp = 0;
            temp = s[i];
            s[i] = s[s.length-1-i];
            s[s.length-1-i] = temp;
        }
    }

(2)递归

/**
     * 递归方法(使用双指针)
     * @param s
     */
     public void reverseString(char[] s){
        reverse(s,0,s.length-1);
     }
     public void reverse(char[] s,int left,int right){
         if (left>=right){
             //长度为奇数时是等于,那么不用换;长度是偶数时是大于,之前小于的时候已经换过
             return;
         }
         char temp = 0;
         temp = s[left];
         s[left] = s[right];
         s[right] = temp;
         //移动指针
         left++;
         right--;
         reverse(s,left,right);
     }

题2:
题目概述:
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

算法思路:
本题要求不能使用高斯公式、不能使用循环,那么就可以利用递归方法来实现,只需先定义一个res变量用来存储结果,然后将传入的值递归加res,并将所传入值减1后递归进行,直到最后传入值为1时,递归结束,返回结果。

算法实现:

class Solution {
    int res = 0;
    public int sumNums(int n) {
        if (n==1){
            return res+n;
        }
        res+=n;
        n--;
        return sumNums(n);
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值