坚持coding第一周:
3*7 =21
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//2023年1月4号
unordered_map<int,int> m;
for(int i=0;i<nums.size();i++){
if(m.find(target-nums[i])!=m.end()){
return {m[target-nums[i]],i};
}
else {
m[nums[i]]=i;
}
}
return {};
}
};
问题:unordered_map 和map有什么不一样?
两个容器的底层实现逻辑。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//2023年1月4号
ListNode* first =new ListNode;
ListNode* ptr = first;
int sum =0;
while(l1||l2||sum)
{
int cur =0;
if(l1&&l2)
{
cur=l1->val+l2->val;
l1=l1->next;
l2=l2->next;
}
else if(nullptr!=l1)
{
cur=l1->val;
l1=l1->next;
}
else if(nullptr!=l2)
{
cur=l2->val;
l2=l2->next;
}
cur=cur+sum;
sum=cur/10;
cur=cur%10;
ListNode* node = new ListNode(cur);
ptr->next=node;
ptr=ptr->next;
}
ptr = first->next;
delete first;
return ptr;
}
};
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//滑动窗口 2023年1月4号
int len = s.size();
int j=0;
int ans=0;
unordered_set<char> se;
for(int i=0;i<len;i++)
{
if(i!=0)
{
se.erase(s[i-1]);
}
while(j<len&&se.find(s[j])==se.end())
{
se.insert(s[j]);
j++;
}
ans =max(ans,j-i);
if(j==len)
{
break;
}
}
return ans;
}
};
4.寻找两个有序数组的中位数 - 寻找两个正序数组的中位数 - 力扣(LeetCode)
class Solution {
public:
string longestPalindrome(string s) {
//2023 0105 动态规划
int n =s.size();
string ans;
if(n==0)
{
return ans;
}
int dp[n][n];
for(int len=1;len<=n;len++)
{
for(int i=0;i+len<=n;i++)
{
int j=i+len-1;
if(len==1)
{
dp[i][j]=1;
}
else if(len==2)
{
dp[i][j]= s[i]==s[j]?1:0;
}
else
{
dp[i][j]= s[i]==s[j]&&dp[i+1][j-1]?1:0;
}
if(dp[i][j]&&ans.size()<len)
{
ans=s.substr(i,len);
}
}
}
return ans;
}
};
class Solution {
public:
//中心扩展法
pair<int, int> expandAroundCenter(const string& s, int left, int right) {
while (left >= 0 && right < s.size() && s[left] == s[right]) {
--left;
++right;
}
return {left + 1, right - 1};
}
string longestPalindrome(string s) {
int start = 0, end = 0;
for (int i = 0; i < s.size(); ++i) {
auto [left1, right1] = expandAroundCenter(s, i, i);
auto [left2, right2] = expandAroundCenter(s, i, i + 1);
if (right1 - left1 > end - start) {
start = left1;
end = right1;
}
if (right2 - left2 > end - start) {
start = left2;
end = right2;
}
}
return s.substr(start, end - start + 1);
}
};
class Solution {
public:
string convert(string s, int numRows) {
//2023.1.05 Z字形变换
if(numRows==1){
return s;
}
vector<string> ans(numRows);
int len =s.size();
int flag =1;
int count =0;
for(int i=0;i<len;i++)
{
ans[count]+=s[i];
if(flag==1){
count++;
}
if(flag==-1){
count--;
}
if(count==numRows-1||count==0){
flag=-flag;
}
}
string ret;
for(int i=0;i<numRows;i++)
{
ret+=ans[i];
}
return ret;
}
};
class Solution {
public:
int reverse(int x) {
//2023.1.05
int ans=0;
while(x)
{
if(ans<INT_MIN/10||ans>INT_MAX/10)
{
return 0;
}
ans=ans*10+x%10;
x=x/10;
}
return ans;
}
};
8. 字符串转换整数 (atoi) - 力扣(LeetCode)
class Solution {
public:
int myAtoi(string s) {
//2023年1.06
int len =s.size();
int flag=1,ans=0;
int ptr=0;
//第一遍去空格
for(int i=0;i<len;i++)
{
if(s[i]==' ') {
continue;
} else {
ptr=i;
break;
}
}
//判断+-
if(s[ptr]=='-') {
flag=-1;
ptr++;
}
else if(s[ptr]=='+')
{
ptr++;
}
//计算数的大小
for(int i=ptr;i<len;i++)
{
if(s[i]<'0'||s[i]>'9') {
break;
} else {
if(flag==1)
{
a
}
ans=ans*10+s[i]-'0';
}
}
return ans*flag;
}
};
class Solution {
public:
bool isPalindrome(int x) {
//2023.1.07
if (x<0) return false;
long y=0;
int xdup=x;
while(x)
{
y=y*10+x%10;
x=x/10;
}
return y==xdup ? true:false;
}
};
class Solution {
public:
int maxArea(vector<int>& height) {
//2023.1.07 双指针法
int ans = 0;
int left = 0;
int right = height.size()-1;
while(left<right)
{
ans = max(ans,min(height[left],height[right])*(right-left));
if(height[left]>height[right]){
right--;
} else {
left++;
}
}
return ans;
}
};
class Solution {
public:
string intToRoman(int num) {
//2023.1.07,强制编码
string ones[10] = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
string tens[10] = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
string hundreds[10] = {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
string thousands[4] = {"","M","MM","MMM"};
return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
}
};
//哈希表
class Solution {
public:
int romanToInt(string s) {
//2023.1.17
unordered_map <char,int> m =
{
{'I',1},
{'V',5},
{'X',10},
{'L',50},
{'C',100},
{'D',500},
{'M',1000}
};
//shiyanyang
//IV
int ret=0;
for(int i=0;i<s.size();i++)
{
if(i+1<s.size()&&m[s[i]]<m[s[i+1]])
{
ret-=m[s[i]];
}else
{
ret+=m[s[i]];
}
}
return ret;
}
};
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
//2023.1.07
string ret={};
int minLen = INT_MAX;
for(int i=0;i<strs.size();i++)
{
minLen= strs[i].size()<minLen?strs[i].size():minLen;
}
for(int i=0;i<minLen;i++)
{
char c;
for(int j=0;j<strs.size();j++)
{
c =strs[0][i];
if(c!=strs[j][i])
{
return ret;
}
}
ret=ret+c;
}
return ret;
}
};