力扣题笔记

笔记整理

    • 7-整数翻转——INT 最大值的数据边界判定技巧
    • 283.移动零——双指针
    • 9.回文数判定——判断一半的数学方法
    • 14.最长公共前缀——水平扫描法

7-整数翻转——INT 最大值的数据边界判定技巧

力扣题笔记_第1张图片
1.巧妙运用int变量 不用额外使用字符串
2.使用INT_MAX INT_MIN 来判断 因为 INT_MAX +pop 会超出 所以分两种情况 两种情况 取 或
第一种:ans >INT_MAX 直接 数字溢出
第二种:ans==INT_MAX/10 取决于后面的pop

283.移动零——双指针

力扣题笔记_第2张图片
没什么难度 就是双指针思想 get到了for 的妙用
可以作为双指针原地修改的模板
两行代码轻松实现

for(int i=0,j=0;i<nums.size();i++)
if (nums[i]!=0) swap(nums[i],nums[j++]);

9.回文数判定——判断一半的数学方法

力扣题笔记_第3张图片
用int 翻转可能会出现overflow
实际上只需要翻转一半就好了
那么如何判定他达到一半呢
我们将旧数去尾巴的同时也将新数增加
如果新数比旧数还要大 或者相同的时候 就停止

class Solution {
public:
    bool isPalindrome(int x) {
        if(x<0 || x%10==0 &&x!=0) return false; //尾数是0的直接不用倒了
       int ans =0;
            while(ans<x)
            {
              ans=ans *10+x%10;
                x/=10;
            }
            //奇数和偶数不同 奇数是/10 偶数就直接相同
     return ans/10==x ||  ans ==x ;
    }
};

另外,此算法还需要讲究一个特殊情况 当尾巴是0的时候直接false 但是0也是 0 所以应该加入两个判断条件,此地方容易出错
因为每次迭代我们都要除10 如果数字是10那么就是 1
因此时间复杂度分析 是O(log10(n))

14.最长公共前缀——水平扫描法

力扣题笔记_第4张图片
补充一下题意
什么是最长公共前缀
1.是最长且所有子串共有的 2.必须是从头开始的

既然是所有子串共有的

那么可以将子串 1子串2 最长的部分 进行比较 然后再与子串3 进行比较

这里我们将被比较的部分设为temp
如果不相同 就不断的把temp缩短 直到相同位置 or 是空子串为止
这里的substr也可以用双重循环来代替 时间复杂度相同

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size()==0)return "";
        string temp=strs[0];
         int i=1 ;
         while (i<strs.size())
           {
            if (temp==strs[i].substr(0,temp.length()))
             {
                 i++;   
                 continue;
             }      
           else
             {
                 temp.erase (temp.length()-1);//把temp 改短 
                 if (temp==""){break;}
            }
           }    
       return temp;
    }
};

你可能感兴趣的:(算法)