LeetCode算法练习题目一: 给定一个字符串,要求将该字符串反转后输出
努力学习,天天向上。借助LeetCode的题目,练习编码能力,数据结构,以及C++和Python的编码能力。
一. 算法实现
解法一: 首尾互换位置
(重点:关注到不同方法的时间复杂度,空间复杂度,以及一种评测算法效率的实现方式)
比较好的方式,首位交换位置
C++实现方式如下:
1 # include <iostream> 2 3 using namespace std; 4 5 class Solution{ 6 public: 7 void reverseString(string str); 8 }; 9 10 void Solution::reverseString(string str) 11 { 12 int i; 13 int j = str.length()-1; 14 unsigned char temp; 15 while(i < j) 16 { 17 temp = str[i]; 18 str[i] = str[j]; 19 str[j] = temp; 20 i++;j--; 21 } 22 for(i=0;i<str.length();i++) 23 cout << str[i]; 24 cout << endl; 25 } 26 27 int main(void) 28 { 29 Solution str; 30 str.reverseString("hello,wwz"); 31 return 0; 32 }
结果如下:
python实现方式:
1 def ReverseSting1(list_string): 2 length = len(list_string); 3 i = 0; 4 j = length - 1; 5 while i < j: 6 temp = list_string[j]; 7 list_string[j] = list_string[i]; 8 list_string[i] = temp; 9 i += 1; 10 j -= 1; 11 print(list_string) 12 13 14 string = 'abcdefghijklmn' 15 list_string = list(string) 16 ReverseSting1(list_string)
结果如下:
注意:python中的字符串是只读属性,因此为了方便修改,将其转换成列表是一个不错的选择。
解法二: 暴力执行
最简单的方式,就是暴力执行,将整个数据包遍历一遍。如果有n个数据,因此需要执行n次,时间复杂度就是很直观的O(n),代码就不写了,比较简答
二. 效率分析
首尾交换
假如有n个元素,由于首尾同时遍历扫描,因此将会执行n/2次运算,可算作时间复杂度为O(n/2),实际上没有这种说法,对于同等量级的运算更多都会表示为O(n)
暴力执行
前文已经描述,方案简单,逻辑简单,就是只管的O(n)
对比分析预测
针对首尾交换的n/2次运算(时间为T1),以及暴力法的n次运算(时间为T2),按理说执行时间应该几乎一致,也就是T1 = 1/2 * T2 ,但是由于首尾交换每次执行运算量稍多一些,所以时间应为T1 > 1/2 * T2。
下面我们实际上机验证,再次也给出一种测试算法效率的方法:
(未完待续)