LeetCode的medium题集合(C++实现)十二

来源:互联网 发布:杭州网络 编辑:程序博客网 时间:2024/05/16 09:36

1 Sqrt(x)
Implement int sqrt(int x).Compute and return the square root of x.
因为这里都是整数,可以直接采用二分法求解

int mySqrt(int x) {       if (x <= 1) return x;    int begin = 1, end =x, mid = 0;    while (begin<=end)    {        mid = (begin + end) / 2;        if (mid<x / mid) //不要用乘法判断,否则会越界        {            begin = mid + 1;        }        else if (mid>x / mid)        {            end = mid - 1;        }        else if (mid == x / mid)            return mid;    }    return end;    }

牛顿迭代法:设r是f(x)=0的根,选取x0作为r的初始近似值,过点(x0,f(x0))做曲线f(x)=y的切线L,L的方程为y=f(x0)(xx0)+f(x0),求出L与x轴交点的横坐标x1=x0f(x0)f(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线的切线,并求该切线与x轴交点的横坐标,称为r的二次近似值。重复以上过程,得r的近似值序列xn+1=xnf(xn)f(xn),其中,称为r的n+1次近似值,上式称为牛顿迭代公式。
当第n+1次与第n次近似值的差相差几乎为0时,即得到方程的解。
这里记f(x)=x2X,求导得f(x)=2x,代入上述迭代公式得到xn+1=xn/2+X/(2xn)

int mySqrt(int x) {       if (x == 0)        return 0;    double last;    double res = 1;    do    {        last = res;        res = x / (2 * last) + last / 2.0;    } while (abs(res - last) > 0.001);    return int(res);    }

2 Simplify Path
Given an absolute path for a file (Unix-style), simplify it.
用一个vector容器保存目录,当有多个’/’出现时去掉重复的,当出现’..’时是返回上一个目录,如果容器大小不为0,要去掉容器末尾的元素。

string simplifyPath(string path) {        vector<string> res;        int len=path.length();        string mid;        int start=0;        while(start<len)        {            while(path[start]=='/'&&start<len)                 start++;  //去掉重复'/'            while(path[start]!='/'&&start<len)            {               //记录下每一级目录                mid+=path[start];                start++;            }            if(mid=="."||mid=="")             {                mid.clear(); //进入下一次循环前,记得清空mid                continue;            }            if(mid=="..")            {                if(res.size()>0)                   res.pop_back();                mid.clear();                 continue;            }            res.push_back(mid);            mid.clear();        }        string result;        int n=res.size();        for(int i=0;i<n;i++)        {            result=result+"/"+res[i];        }        if(result=="") result="/";        return result;    }
0 0
原创粉丝点击