C/C++每日一练(20230507) 数列第n项值I/II、简化路径

简介: C/C++每日一练(20230507) 数列第n项值I/II、简化路径

1. 求数列的第n项的值


已知数列:2,4,4,4,6,6,6,6,6,8,8,8,8,8,8,8,...求第n项的值


出处:

https://edu.csdn.net/practice/27223961

代码:

#include <iostream>
int main()
{
    unsigned int N;
    std::cout << "Please enter the value of N: ";
    std::cin >> N;
    if (N % 2 != 0)
    {
        std::cout << "Please enter an even number greater than zero!" << std::endl;
        return -1;
    }
    int oddCount = 1;
    int printCount = 0;
    for (int i = 2; i <= N; i += 2)
    {
        for (int j = 0; j < oddCount; j++)
        {
            std::cout << i << " ";
            printCount++;
            if (printCount == N)
            {
                std::cout << "<---这个就是第N = " << N << "个数。" << std::endl;
                return 0;
            }
        }
        oddCount += 2;
    }
    return 0;
}

以上是原题的答案,但从题目上看没有说只求偶数项的值。修改为:

```c++

#include <iostream>
int main()
{
    unsigned int N;
    std::cout << "Please enter the value of N: ";
    std::cin >> N;
    int oddCount = 1;
    int printCount = 0;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 0; j < oddCount; j++)
        {
            std::cout << i*2 << " ";
            printCount++;
            if (printCount == N)
            {
                std::cout << "<---这个就是第N = " << N << "个数。" << std::endl;
                return 0;
            }
        }
        oddCount += 2;
    }
    return 0;
}
```



2. 求数列的第n项的值 II


 已知一数列:1,3,3,5,5,5,7,7,7,7,9,9,9,9,9,11,11,11,11,11,11,11.....请根据规律求出第n项的值。


例如:

n=4 时,其值为5,

n=11时,其值为9.

输入格式 一个自然数n,(0<n<1000)


输出格式 一个整数,即第n项的值。

样例输入:4

样例输出 :5

出处:

https://edu.csdn.net/practice/27223962

代码:

#include <iostream>
using namespace std;
int main(){
    int a,b;
    cin>>a;
    int n=1,count=1,num=1;
    for(int i=0;i<a;i++)
    {
        if(count > n)
        {
            num+=2;
            n++;
            count=1;
            i--;
        }
        else
        {
        cout << num << ",";    
        count++;
        }
    }
    cout << endl;
    cout << num;
    return 0;
}



以上是原题的答案,数列输出最后一项后应该去掉“,”:

···c++

#include <iostream>
using namespace std;
int main(){
    int a,b;
    cin>>a;
    int n=1,count=1,num=1;
    for(int i=0;i<a;i++)
    {
        if(count > n)
        {
            num+=2;
            n++;
            count=1;
            i--;
        }
        else
        {
        cout << num;    
        count++;
        if (i+1 < a)
            cout << ",";
        }
    }
    cout << endl;
    cout << num;
    return 0;
}
```



3. 简化路径


给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。


在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。


请注意,返回的 规范路径 必须遵循下述格式:


   始终以斜杠 '/' 开头。

   两个目录名之间必须只有一个斜杠 '/' 。

   最后一个目录名(如果存在)不能 以 '/' 结尾。

   此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。

返回简化后得到的 规范路径 。


示例 1:

输入:path = "/home/"

输出:"/home"

解释:注意,最后一个目录名后面没有斜杠。  


示例 2:

输入:path = "/../"

输出:"/"

解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。


示例 3:

输入:path = "/home//foo/"

输出:"/home/foo"

解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。


示例 4:

输入:path = "/a/./b/../../c/"

输出:"/c"


提示:

   1 <= path.length <= 3000

   path 由英文字母,数字,'.','/' 或 '_' 组成。

   path 是一个有效的 Unix 风格绝对路径。

以下程序实现了这一功能,请你填补空白处内容:

```c++

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char *simplifyPath(char *path)
{
    int len = strlen(path);
    if (len == 0)
    {
        return path;
    }
    char *p = path;
    int *indexes = malloc(len * sizeof(int));
    int depth = 0;
    int name_start = 1;
    while (*p != '\0')
    {
        if (*p == '/')
        {
            if (p > path && *(p - 1) != '/' && *(p - 1) != '.')
            {
                name_start = 1;
            }
        }
        else if (*p == '.')
        {
            if (*(p + 1) == '\0' || *(p + 1) == '/')
            {
                p += 1;
            }
            else if (*(p + 1) == '.' && (*(p + 2) == '\0' || *(p + 2) == '/'))
            {
                if (depth > 0)
                {
                    depth--;
                    name_start = 1;
                }
                p += 2;
            }
            else
            {
                indexes[depth++] = p - path;
                while (*p != '/' && *p != '\0')
                {
                    p++;
                }
            }
            if (*p == '\0')
            {
                break;
            }
        }
        else
        {
            if (name_start && depth >= 0)
            {
                indexes[depth++] = p - path;
                name_start = 0;
            }
        }
        p++;
    }
    int i;
    char *result = malloc(len + 1);
    char *q = result;
    if (depth <= 0)
    {
        *q++ = '/';
    }
    else
    {
        for (i = 0; i < depth; i++)
        {
            ____________________;
        }
    }
    *q = '\0';
    return result;
}
int main(int argc, char **argv)
{
    if (argc != 2)
    {
        fprintf(stderr, "Usage: ./test path\n");
        exit(-1);
    }
    printf("%s\n", simplifyPath(argv[1]));
    return 0;
}
```


出处:

https://edu.csdn.net/practice/27223963


原题答案选择项为:

p = path + indexes[i];
*q++ = '/';
while (*p != '/')
{
    *q++ = *p++;
}

测试未通过,改用c++  

代码:

#include<iostream>
#include<vector>
#include<cstring>
#include<sstream>
#include<stack>
using namespace std;
string simplifyPath(string path) {
    vector<string> v;
    stringstream ss(path);  // 使用字符串流方便处理
    string ans="", s="";
    while (getline(ss, s, '/')) {  // 按照'/'分割路径
        if (s == "." || s == "") {
            continue;
        }
        else if (s == "..") {  // 遇到".."弹出上一级目录
            if (v.size() > 0) {
                v.pop_back();
            }
        }
        else {
            v.push_back(s);
        }
    }
    if (v.size() == 0) {
        ans = "/";
    }
    else {
        for (const string& s: v) {
            ans += "/" + s;
        }
    }
    return ans;
}
int main() {
    string path = "/home/";
    cout << simplifyPath(path) << endl;
    path = "/../";
    cout << simplifyPath(path) << endl;
    path = "/home//foo/";
    cout << simplifyPath(path) << endl;
    path = "/a/./b/../../c/";
    cout << simplifyPath(path) << endl;
    return 0;
}


输出:

/home

/

/home/foo

/c







目录
相关文章
|
6月前
|
算法 测试技术 C++
【动态规划】【图论】【C++算法】1575统计所有可行路径
【动态规划】【图论】【C++算法】1575统计所有可行路径
|
6月前
|
机器学习/深度学习 算法 测试技术
【动态规划】C++算法:446等差数列划分 II - 子序列
【动态规划】C++算法:446等差数列划分 II - 子序列
|
5月前
|
算法 C++
【动态规划】斐波那契数列模型(C++)
【动态规划】斐波那契数列模型(C++)
|
1月前
|
人工智能 C++
第十四届省赛大学B组(C/C++)接龙数列
第十四届省赛大学B组(C/C++)接龙数列
|
3月前
|
编译器 C++
VS Code设置C++编译器路径
VS Code设置C++编译器路径
45 0
|
5月前
|
算法 C++
【动态规划】零基础解决路径问题(C++)
【动态规划】零基础解决路径问题(C++)
|
5月前
|
设计模式 算法 程序员
【C++】大气、正规的编程习惯:C++学习路径与注意事项
【C++】大气、正规的编程习惯:C++学习路径与注意事项
65 0
|
5月前
|
C++
C++ 获取当前程序路径
C++ 获取当前程序路径
|
6月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
97 1
Linux 终端操作命令(1)
|
6月前
|
算法 C++
【动态规划】【矩阵】C++算法329矩阵中的最长递增路径
【动态规划】【矩阵】C++算法329矩阵中的最长递增路径