LeetCode第一天
来源:互联网 发布:更新多字段sql语句 编辑:程序博客网 时间:2024/06/17 00:34
今天是第一天在LeetCode上进行刷题,发现这里的题目很基础。并且其提供了在线的编译器,可以直接写代码和测试用例并进行调试,很方便。做了几道难度系数为Easy的题,总结如下:
一、1. Two Sum
题目要求是给定一组数和一个目标数,返回这组数中加和为目标数的那两个数在这组数中的索引。
我的解法是用一个双层的循环,让第一个数与其他的数依次进行加和运算,判断和是否为目标数,如果是则循环结束,返回索引值;否则再让第二个数与其他的数(不包括第一个数,因为前一层循环已经计算过了)依次进行加和运算...。一直这样做直到找到索引为止。用C++进行实现后,发现时间为二百多毫秒,很慢。代码如下:
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> result ; for(int i=0; i<nums.size(); ++i) { for(int j=i+1; j<nums.size(); ++j) { if((nums[i] + nums[j]) == target) { result.push_back(i) ; result.push_back(j) ; break ; } } } return result ; }};
leetcode上这道题的两种优秀解法如下:
解法一:利用C++中的map集合类型,它是一个<key,value>集合。首先将这组数的值(key)和索引位置(vlaue)添加到map当中。然后遍历map,在其中查找(目标数-当前数),如果找到了,则直接取出该(目标数-当前数)所对应的value(即其索引位置),然后返回当前数的索引和取出的value。在这种解法下,通过使用map,加快了程序的速度。
解法二:解法二是对解法一的进一步改进。首先遍历这组数,直接map中进行查找(目标数-当前数),如果找到则返回然后返回当前数的索引和取出的value;否则将当前数添加到map中。此时只需要一层循环即可完成程序所需功能。进一步提高了程序的运行效率。
二、7. Reverse Integer
题目要求是给定一个整型数,逆序输出该整型数。同时假定该整型数是32位的,逆序后如果数溢出了,输出值为0。
我的解法是对负数进行了处理,将其转换为整数后再逆序输出。同时32位整型的范围是-2^31~2^31(不包括2^31),对于溢出的判断,使用了double。代码如下:
class Solution {public: int reverse(int x) { double r = 0; int flag = 0 ; int i=0 ; if(x < 0) { x = -x ; flag = 1 ; } if(flag == 1 && x<0) { return 0 ; } while(x!=0) { r = r*10 + (x%10) ; x = x/10 ; } return (r > pow(2,31)) ? 0 : (flag==1) ? (int)-r : (int)r ; }};
后来参考了优秀的解法,发现可以使用long long并且对于负数不用做特殊的处理,相比之前的程序,这样做代码变短了,时间也加快了。代码如下:
class Solution {public: int reverse(int x) { long long r = 0 ; while(x!=0) { r = r*10 + (x%10) ; x = x/10 ; } return (r > pow(2,31) || r < -pow(2,31)) ? 0 : r ; }};
leetcode上这道题的优秀解法是:
由于每次进行逆序变换时都要进行对10的整除和取模运算,因此在每一次计算得到逆序值之后,判断该逆序值对10整除的结果与上一次循环得到的逆序值是否相同,如果不相同则发生了溢出,否则最后可以得到逆序结果。这种解法不用进行特意溢出的判断,利用在逆序计算过程中中间值之间的关系来间接判断数据是否溢出,很巧妙。
三、9. Palindrome Number
题目要求是判断一个整型数是否为回文字符串,不能使用额外的空间。
我的解法是先计算出该整型数的首尾数字,如果相等,则计算出这个数去掉首尾数字得到的整型数,再次判断该整型数的首尾是否相等,依次类推...;如果不相等则说明该整型不是回文字符串。在循环过程中有一个计数的变量,如果这个变量最后的值为0(整型数是奇数位)或-1(整型数是偶数位),则说明该整型数是回文数,否则如果最后的数变为了0,则该整型数是回文数,否则不是回文数,这一判断是对类似100001这样的数进行的。代码如下:
class Solution {public: bool isPalindrome(int x) { if(x<0) { return false ; } // 判断x由几位数字 int len = 0; int k = x ; while(k) { k = k/10 ; ++ len ; } int j = len-1 ; while(x/10 != 0) { if((x%10) != (x/mi(j))) { return false ; } x = x/10 - (x%10)*mi(j-1) ; j = j-2 ; } return (j==0 || j==-1) ? true : (x==0) ? true : false ; } int mi(int k) { int res = 1 ; for(int i=1; i<=k; ++i) { res = res * 10 ; } return res ; }};
leetcode上的优秀解法是:将这个数逆序输出,如果逆序之后的数与原来的数相同或者逆序之后的数整除10得到的数与原来的数相同(针对100001这样的数),则这个数是回文数,否则不是回文数。
四、13. Roman to Integer
题目要求是将罗马数装换为整型数。
罗马数到整型的转换规则为:
'I' = 1 ; 'V' = 5 ; 'X' = 10 ; 'L' = 50 ; 'C' = 100 ; 'D' = 500 ; 'M' = 1000 ;
在进行计算时从右向左计算,如果小数(I,C,X)在大数左面,则用该大数减去小数;其余情况进行加法运算。
我的解法是按照上面的规则从右向左依次进行计算,代码参考了网上的代码。
class Solution {public: int romanToInt(string s) { if(s.length() == 0) return 0 ; map<char,int> m ; m['I'] = 1 ; m['V'] = 5 ; m['X'] = 10 ; m['L'] = 50 ; m['C'] = 100 ; m['D'] = 500 ; m['M'] = 1000 ; int sum = m[s[s.length()-1]] ; for(int i=s.length()-1; i>=0; --i) { if(m[s[i-1]] >= m[s[i]]) { sum += m[s[i-1]] ; } else { sum -= m[s[i-1]] ; } } return sum ; }};
五、14. Longest Common Prefix
题目要求是求出一组字符串中的最长公共子串。
我的解法是取出第一个字符串,依次判断其每一个字母是否在其他字符串的对应位置,如果不是则循环结束;否则一直进行下去直到达到循环终止条件。代码如下:
class Solution {public: string longestCommonPrefix(vector<string>& strs) { if(strs.size() == 0) return "" ; string pre = ""; int f = 0 ; for(int k=0; k<strs[0].length(); ++k) { //cout << strs[0][k] << endl ; for(int j=1; j<strs.size(); ++j) { //cout << strs[j][k] << endl ; if(strs[0][k] != strs[j][k]) { f = 1 ; break ; } } if(f == 1) break ; pre += strs[0][k] ; } return pre ; }};
六、20. Valid Parentheses
题目要求相当于是判断给定括号() {} []序列,判断括号是否匹配。
我的解法是使用栈结构进行判断,栈是一种先进后出的结构,很适合该题的形式。代码如下:
class Solution {public: bool isValid(string s) { if(s.length()%2 !=0) return false ; char c[s.length()] ; int top = 0 ; int flag = 0 ; for(int i=0; i<s.length(); ++i) { if(s[i]!=')' && s[i]!='}' && s[i]!=']') { c[top] = s[i]; ++ top ; } else { if(top > 0) { switch(s[i]) { case ')' : if(c[top-1]!='(') return false ; else --top ; break ; case '}' : if(c[top-1]!='{') return false ; else --top ; break ; case ']' : if(c[top-1]!='[') return false ; else --top ; break ; } } else { return false ; } } } if(top == 0) return true ; else return false ; }};
leetcode上的优秀解法使用了C++中的stack来进行操作。
做了这些题之后,对比自己的解法与优秀的解法,找到了自己的不足的同时也拓宽了思路。
- LeetCode第一天
- LeetCode第一天
- LeetCode第一天--------TwoSum
- [15.10.30]Leetcode第一天
- leetcode第一天~344. Reverse String
- 7.17 leetcode 第一天刷题成功
- 每天一题LeetCode [第一天]
- 第一天
- 第一天
- 第一天~
- 第一天
- 第一天
- 第一天
- 第一天
- 第一天
- #第一天
- 第一天
- 第一天
- css(css3)实现垂直水平居中的那些事
- java基础(二)------数组与字符串
- SKU多维属性状态判断算法
- CODE-1015 计算器的改良
- 定时器CountDownTimer
- LeetCode第一天
- java垃圾回收机制
- FreeImage加速保存图像
- C++ size_t 和size_type的区别
- bzoj2227: [Zjoi2011]看电影(movie)
- 迷瘴(贪心)
- AppDelegate
- 使用result标签出错.
- UVa 839