leetcode-简单题-题序:1+7
leetcode-簡單題-題序:1+7
- 1.兩數(shù)之和
- 題目
- 知識點(diǎn)
- 解決過程
- 結(jié)果
- 難點(diǎn)
- 7.整數(shù)反轉(zhuǎn)
- 題目
- 知識點(diǎn)
- 解決過程
- 結(jié)果
- 難點(diǎn)
1.兩數(shù)之和
題目
給定一個整數(shù)數(shù)組 nums 和一個目標(biāo)值 target,請你在該數(shù)組中找出和為目標(biāo)值的那 兩個 整數(shù),并返回他們的數(shù)組下標(biāo)。
你可以假設(shè)每種輸入只會對應(yīng)一個答案。但是,數(shù)組中同一個元素不能使用兩遍。
知識點(diǎn)
一、什么是vector?
向量(Vector)是一個封裝了動態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象。可以簡單的認(rèn)為,向量是一個能夠存放任意類型的動態(tài)數(shù)組。
二、容器特性
1.順序序列
順序容器中的元素按照嚴(yán)格的線性順序排序。可以通過元素在序列中的位置訪問對應(yīng)的元素。
2.動態(tài)數(shù)組
支持對序列中的任意元素進(jìn)行快速直接訪問,甚至可以通過指針?biāo)闶鲞M(jìn)行該操作。操供了在序列末尾相對快速地添加/刪除元素的操作。
三、函數(shù)
1.push_back 在數(shù)組的最后添加一個數(shù)據(jù)
2.pop_back 去掉數(shù)組的最后一個數(shù)據(jù)
3.size 當(dāng)前使用數(shù)據(jù)的大小
解決過程
#include <vector> class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int>res;for(int i=0;i<nums.size();i++){nums[i]=target-nums[i];for(int j=i+1;j<nums.size();j++){if(nums[i]==nums[j]){res.push_back(i);res.push_back(j);}}}return res;} };結(jié)果
難點(diǎn)
- vector類型、函數(shù)的基礎(chǔ)知識
7.整數(shù)反轉(zhuǎn)
題目
給出一個 32 位的有符號整數(shù),你需要將這個整數(shù)中每位上的數(shù)字進(jìn)行反轉(zhuǎn)。
知識點(diǎn)
一、整數(shù)轉(zhuǎn)字符串:itoa()
二、整數(shù)轉(zhuǎn)字符串 stringstream
解決過程
一、求整數(shù)位數(shù)
#include <stdlib.h> #include <cmath> class Solution { public:int reverse(int x) {int y=0;//resint num=1;//位數(shù)int a=0;//0為正,1為負(fù)int e=0;if(x<0){a=1;}x=abs(x);double u=pow(10,num);while(x!=x%u){num+=1;u=pow(10,num);}for(int i=0;i<num;i++){y+=pow(10,i)*(x/int(pow(10,num-1-i)));e=pow(10,num-1-i);x=x%e;}if(a==0){return y;}else{return -y;}} }; Line 15: Char 19: fatal error: invalid operands to binary expression ('int' and 'double')while(x!=x%u){~^~ 1 error generated.二、itoa() 整數(shù)轉(zhuǎn)字符串,求字符串長度
#include <cstdlib> #include <cmath> #include <cstdio> class Solution { public:int reverse(int x) {int y=0;//resint num=1;//位數(shù)int a=0;//0為正,1為負(fù)int e=0;if(x<0){a=1;}x=abs(x);// double u=pow(10,num);// while(x!=x%int(u)){// num+=1;// u=pow(10,num);// }char str[32];itoa(x,str,10);for(int i=0;i<str.length();i++){y+=pow(10,i)*(x/int(pow(10,num-1-i)));e=pow(10,num-1-i);x=x%e;}if(a==0){return y;}else{return -y;}} }; Line 22: Char 9: fatal error: use of undeclared identifier 'itoa'itoa(x,str,10);^ 1 error generated.itoa是廣泛使用的非知標(biāo)準(zhǔn)C語言和C++語言擴(kuò)展功能。但因?yàn)樗且粋€非標(biāo)準(zhǔn)的C / C++語言功能,因此不能被所有編譯器使用。在大多數(shù)Windows下的編譯器通常在內(nèi)頭文件包含容非標(biāo)準(zhǔn)函數(shù)。
三、stringstream 整數(shù)轉(zhuǎn)字符串,求字符串長度
#include <cstdlib> #include <cmath> #include <cstdio> #include <sstream> class Solution { public:int reverse(int x) {int y=0;//resint num=1;//位數(shù)int a=0;//0為正,1為負(fù)int e=0;if(x<0){a=1;}x=abs(x);// double u=pow(10,num);// while(x!=x%int(u)){// num+=1;// u=pow(10,num);// }// char str[32];// itoa(x,str,10);stringstream ss;ss << x;string str = ss.str();for(int i=0;i<str.length();i++){//cout<<x/pow(10,str.length()-1-i)<<endl;y+=pow(10,i)*(x/int(pow(10,str.length()-1-i)));e=pow(10,str.length()-1-i);x=x%e;}if(a==0){return y;}else{return -y;}} }; Line 30: Char 14: runtime error: 9.64632e+09 is outside the range of representable values of type 'int' (solution.cpp) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:40:14double必須要轉(zhuǎn)換成int,不然整除符號/ 不起作用。
for(int i=0;i<str.length();i++){cout<<x/pow(10,str.length()-1-i)<<endl;y+=pow(10,i)*(x/int(pow(10,str.length()-1-i)));e=pow(10,str.length()-1-i);x=x%e;} for(int i=0;i<str.length();i++){cout<<x/int(pow(10,str.length()-1-i))<<endl;y+=pow(10,i)*(x/int(pow(10,str.length()-1-i)));e=pow(10,str.length()-1-i);x=x%e;}
但是,如果對于一個很大的數(shù),double轉(zhuǎn)成int,會超出10的10次方限制。一個數(shù),1526383749逆序,則是9.47383e+09,超出可以轉(zhuǎn)化的范圍,報錯。
double轉(zhuǎn)int的矛盾我暫時沒有找到解決方法。
四、看題解得,放棄計算長度,直接while循環(huán)判斷是否計算結(jié)束。取余+整除10,進(jìn)入while循環(huán)取余+整除10。
class Solution { public:int reverse(int x) {if(x<10&&x>-10){return x;}int temp=x%10;x=x/10;while(x>=1||x<=-1){temp=temp*10+x%10;x=x/10;if(temp > INT_MAX/10 || temp < INT_MIN/10) //檢查溢出return 0;}return temp;} };
整型一定是小于等于整型最大解的,所以就算溢出了,我們也不知道,取不到溢出值,所以判斷失誤。
五、基于四進(jìn)行修改,將temp定義為long long類型,就可以取到整型溢出值,從而判斷整型是否溢出。
class Solution { public:int reverse(int x) {if(x<10&&x>-10){return x;}long long temp=x%10;x=x/10;while(x>=1||x<=-1||x!=0){temp=temp*10+x%10;x=x/10; if(temp > INT_MAX || temp < INT_MIN) //檢查溢出return 0;}return temp;} };
六、原題解。判斷temp* 10 是否溢出,這樣int temp是可以渠道某一個值的。但是不是很嚴(yán)謹(jǐn),因?yàn)樵谧詈笠徊?#xff0c;temp* 10+x,我們之前判斷的是temp* 10是否溢出,而不是判斷temp* 10+x是否溢出。
結(jié)果
難點(diǎn)
-
求整數(shù)反轉(zhuǎn)本身
- 取余,整除10,循環(huán)。
- 如果整數(shù)太大,不要用整數(shù)長度for循環(huán)。
-
整型溢出問題,如何正確判斷。有兩種辦法:
- 把值設(shè)為long long類型,可以直接用最終值判斷溢出。
- 從最終值的前一步入手,判斷下一步是否溢出。
總結(jié)
以上是生活随笔為你收集整理的leetcode-简单题-题序:1+7的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据科学导论 考试有感 2019 山东大
- 下一篇: leetcode-简单题-题序:9+13