小试牛刀之反转字符串

最近玩儿python玩上瘾了,突然想念c语言,所以,休闲下:
解法一:如果没有对申请外部空间有所限制,那就先试试这个喽:

1 void invert_str1(char *old_str, char *new_str)
2 {
3     int i = strlen(old_str)-1;
4     int j = 0;
5     if (old_str == NULL) printf("error!"), exit(1);
6     bzero(new_str, sizeof(new_str));
7     for ( ; new_str[j] = old_str[i]; i--, j++) ;
8 }

解法二:哪有解法一那样的好事,一般都会有申请空间的限制的;

 1 void invert_str2(char *str)
 2 {
 3     int i, j;
 4     if (str == NULL) printf("error!"), exit(1);
 5     for (i = 0, j = strlen(str)-1; i < j; i++, j--) {
 6         str[j] = str[i] ^ str[j];
 7         str[i] = str[i] ^ str[j];
 8         str[j] = str[i] ^ str[j];
 9         }
10 }

解法三:可是毕竟玩儿的是c语言嘛,还是耍一耍指针比较爽:

 1 void invert_str3(char *str)
 2 {
 3     char *p = str;
 4     char *q = str + strlen(str) - 1;
 5     if (str == NULL) printf("error!"), exit(1);
 6     while (p < q) {
 7         *q = *p ^ *q;
 8         *p = *p ^ *q;
 9         *q = *p ^ *q;
10         p++, q--;
11         }
12 }    

解法四:玩着玩着忽然想起来,交换两个变量还可以这么写的:

 1 void invert_str4(char *str)
 2 {
 3     char *p = str;
 4     char *q = str + strlen(str) - 1;
 5     if (str == NULL) printf("error!"), exit(1);
 6     while (p < q) {
 7         *p = *p + *q;
 8         *q = *p - *q;
 9         *p = *p - *q;
10         p++, q--;
11         }
12 }    

解法五:还有啥可玩儿的吗?哦,对了,别忘了递归啊,再来个递归爽一爽:

 1 void invert_str5(char *str, int len)
 2 {
 3     if (len <= 1);
 4     else {
 5         *str = *str ^ *(str+len-1);
 6         *(str+len-1) = *str ^ *(str+len-1);
 7         *str = *str ^ *(str+len-1);
 8         invert_str5(str+1, len-2);
 9         }
10 }

总结:关键词 额外空间申请、指针、对换效率、递归;

小试牛刀之反转字符串

时间: 2024-11-20 22:28:43

小试牛刀之反转字符串的相关文章

反转字符串

问题: 1.反转字符串,比如str=“hello world!!!",反转后ret=“!!!dlrow olleh"; 代码如下: #include <stdio.h> #include <stdlib.h> char* reverse(char inp[],int size){ if(size<0) return NULL; //NULL代表空地址,null只是一个符号 int i=0,j=size-1; while(i<j){ char tmp=

[算法] C# Revert 单词反转字符串[低时间复杂度]

无聊期间想起了一道字符串反转的问题. 大致要求输入"I am a good boy",输出"boy good a am I". 要求不能用已经封装好的方法实现.于是乎,我上网查了一下,基本都是用了封装后类库.于是我自己写了一个小算法,低时间复杂度高空间复杂度的算法. private string Revert(string str) { if (str.Length == 0) { return string.Empty; } string newStr = nul

345. 反转字符串中元音字母的位置 Reverse Vowels of a String

Write a function that takes a string as input and reverse only the vowels of a string. Example 1:Given s = "hello", return "holle". Example 2:Given s = "leetcode", return "leotcede" 题意:反转字符串中元音字母的位置 方法1:用栈保存元音字符串,时间

C# 反转字符串方法

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 反转字符串 { class Program { static void Main(string[] args) { string ss = Reserver("abcdefg"); Console.Write(ss); //数组里面有一个方法用来反转的 除了今天上午用到这个还可以用这个 } ///

Java反转字符串

前几天看见一篇文章,说使用Java能用几种方式反转一个字符串.首先要明白什么叫反转字符串,就是将一个字符串到过来啦,比如"倒过来念的是小狗"反转过来就是"狗小是的念来过倒".接下来就把自己能想到的所有方式记录下来了. 1.第一个念头就是直接使用String类的反转方法,对不起,这样是不行的,因为String类没有这个方法.那么好吧,搞个数组,然后遍历数组,依次调换数组中对应的各个字符. // 直接使用数组首位调换 public String reverse1(Str

【LeetCode-面试算法经典-Java实现】【152-Reverse Words in a String(反转字符串中的单词)】

[152-Reverse Words in a String(反转字符串中的单词)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given an input string, reverse the string word by word. For example, Given s = "the sky is blue", return "blue is sky the". 题目大意 给定一个字符串,将其反转,其的字词不转 解题思路

使用递归算法反转字符串

public class T { //反转字符串 public static String reverseString(String s){ if(s.isEmpty()) return s; return reverseString(s.substring(1))+s.charAt(0); } public static void main(String[] args) { System.out.println(reverseString("123456789")); } }

php实现中文反转字符串的方法

1 <?php 2 3 header("content-type:text/html;charset=utf-8"); 4 /** 5 此函数的作用是反转中文字符串 6 mb_strlen() 获取字符的长度 7 mb_substr() 获取字符的单个元素 8 krsort() 按照键值逆序排序数组 9 implode() 将数组拼接为字符串 10 explode() 使用字符串分隔字符串 11 */ 12 function str_rev_gb($str){ 13 //判断输入

Java反转字符串的方式?

1. 将String转换成字符数组,再利用字符数组进行首尾调换. 2. 利用递归的方式,主要是:reverse(str.substring(1)) + str.charAt(0); 3. 虽然String类没有反转字符串的方法,但是StringBuffer有这个方法,可以借助StringBuffer的这个方法:sb.reverse(); 4. 借助StringBuffer的其他方法,比如:sb.setCharAt(swapIndex,sb.charAt(i)); 再比如:append方法. 5.