代码随想录第八天|LeetCode334.反转字符串|LeetCode541.反转字符串Ⅱ|剑指offer05.替换空格|LeetCode151.反转字符串里的单词|剑指offer58-Ⅱ左旋转字符串

LeetCode334.反转字符串

        基本思路:双指针,一个指向头,一个指向尾,然后两个指进行交换,直到两个指针相遇。

Java代码如下:

public void reverseString(char[] s) {
        int left = 0;
    	int right = s.length - 1;
    	while(left < right) 
    	{
    		char temp = s[left];
            s[left] = s[right];
            s[right] = temp;
    		left++;
    		right--;
    	}
    }

LeetCode541.反转字符串Ⅱ

        基本思路:遍历字符串的时候一次走2*k步,然后再在每次的遍历中反转前k个字符,注意要判断当前这轮循环内是否到达尾端,需要取i+k和n之间的最小值。

Java代码如下:

public String reverseStr(String s, int k) {
    	int n = s.length();
    	char[] arr = s.toCharArray();
    	for(int i = 0; i < n; i += 2*k) 
    	{
    		swap(arr,i,Math.min(i+k, n) - 1);
    	}
    	
    	return new String(arr);
    }

public void swap(char[] arr,int left,int right) 
    {
    	while(left < right) 
    	{
    		char temp = arr[left];
    		arr[left] = arr[right];
    		arr[right] = temp;
    		left++;
    		right--;
    	}
    }

 

 剑指offer05.替换空格

方法一:普通模拟

        基本思路:新建一个字符串,遍历给定的字符串,如果当前字符为空格,那么在新字符串中添加"%20",如果不是就添加当前字符到新字符串中。

Java代码如下:

public String replaceSpace(String s) {
    	StringBuilder res = new StringBuilder();
    	for(char c : s.toCharArray()) 
    	{
    		if(c == ' ') 
    		{
    			res.append("%20");
    		}else 
    		{
    			res.append(c);
    		}
    	}
    	
    	return res.toString();
    }

方法二:双指针 

        基本思路:新建一个字符串(str),遍历原来的字符串,如果遍历到了空格,那么在新字符串中添加两个空格。遍历结束后,如果str的长度为0,说明没有空格,直接返回。定义两个指针,left,right,left指向当前字符串的末尾,然后将两个字符串合并(newStr),right指向新字符串的末尾。然后开始比较left和right指向的字符:

(1)left指向的字符不为空格,newStr[right] = newStr[left],right--,left--。

(2)如果为空格,那么right就需要一步一步赋值上新的值("%20"),结束之和left--,right--。

循环结束,返回newStr。

Java代码如下:

public String replaceSpace_1(String s) {
    	if(s == null || s.length() == 0) 
    	{
    		return s;
    	}
    	
    	StringBuilder str = new StringBuilder();
    	for(int i = 0; i < s.length(); i++) 
    	{
    		if(s.charAt(i) == ' ') 
    		{
    			str.append("  ");
    		}
    	}
    	
    	if(str.length() == 0) 
    	{
    		return s;
    	}
    	
    	int left = s.length() - 1;
    	s += str.toString();
    	int right = s.length() - 1;
    	char[] chars = s.toCharArray();
    	while(left >= 0) 
    	{
    		if(chars[left] == ' ') 
    		{
    			chars[right--] = '0';
    			chars[right--] = '2';
    			chars[right] = '%';
    		}else 
    		{
    			chars[right] = chars[left];
    		}
    		left--;
    		right--;
    	}
    	
    	return new String(chars);
    }

LeetCode151.反转字符串里的单词

         基本思路:不使用语言提供的函数方法,先去除给的字符串开头和结尾的空格,再遍历去除中间多余的空格(题目要求每个单词之间只有一个空格),将得到的新字符串整体反转,再逐个对单词进行反转(每个单词之间还有一个空格分开)。最后将得到的结果返回。

Java代码如下:

public String reverseWords(String s) {
    	StringBuilder sb = deleteSpace(s);
    	reverse(sb,0,sb.length() - 1);
    	reverseEachWord(sb);    	
    	return sb.toString();
    }
    
    public StringBuilder deleteSpace(String s) 
    {
    	int left = 0;
    	int right = s.length() - 1;
    	while(left <= right && s.charAt(left) == ' ') 
    	{
    		left++;
    	}
    	
    	while(left <= right && s.charAt(right) == ' ') 
    	{
    		right--;
    	}
    	
    	StringBuilder sb = new StringBuilder();
    	while(left <= right) 
    	{
    		char c = s.charAt(left);
    		if(c != ' ') 
    		{
    			sb.append(c);
    		}else if(sb.charAt(sb.length() - 1) != ' ') 
    		{
    			sb.append(c);
    		}
    		
    		left++;
    	}
    	
    	return sb;
    }
    
    public void reverse(StringBuilder sb,int left,int right) 
    {
    	while(left < right) 
    	{
    		char temp = sb.charAt(left);
    		sb.setCharAt(left++, sb.charAt(right));
    		sb.setCharAt(right--, temp);
    	}
    }
    
    public void reverseEachWord(StringBuilder sb) 
    {
    	int n = sb.length();
    	int start = 0;
    	int end = 0;
    	while(start < n) 
    	{
    		while(end < n && sb.charAt(end) != ' ') 
    		{
    			end++;
    		}
    		reverse(sb,start,end - 1);
    		start = end + 1;
    		end++;
    	}
    }

 剑指offer58-Ⅱ.左旋转字符串

        基本思路:不使用切片函数,new一个新的字符串,先装n后面字符,再反过来装前n个。

Java代码如下:

public String reverseLeftWords(String s, int n) {
    	StringBuilder sb = new StringBuilder();
    	for(int i = n; i < s.length();i++) 
    	{
    		sb.append(s.charAt(i));
    	}
    	for(int i = 0; i < n;i++) 
    	{
    		sb.append(s.charAt(i));
    	}
    	return sb.toString();
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值