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