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)(x?x0)+f(x0),求出L与x轴交点的横坐标x1=x0?f(x0)f′(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线的切线,并求该切线与x轴交点的横坐标,称为r的二次近似值。重复以上过程,得r的近似值序列xn+1=xn?f(xn)f′(xn),其中,称为r的n+1次近似值,上式称为牛顿迭代公式。
当第n+1次与第n次近似值的差相差几乎为0时,即得到方程的解。
这里记f(x)=x2?X,求导得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;
}
时间: 2024-10-10 18:09:09