您现在的位置是:首页 >技术杂谈 >C/C++每日一练(20230507) 数列第n项值I/II、简化路径网站首页技术杂谈

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

Hann Yang 2024-06-04 00:00:03
简介C/C++每日一练(20230507) 数列第n项值I/II、简化路径

目录

1. 求数列的第n项的值  ※

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

3. 简化路径  ??

? 每日一练刷题专栏 ?

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


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 != '')
    {
        if (*p == '/')
        {
            if (p > path && *(p - 1) != '/' && *(p - 1) != '.')
            {
                name_start = 1;
            }
        }
        else if (*p == '.')
        {
            if (*(p + 1) == '' || *(p + 1) == '/')
            {
                p += 1;
            }
            else if (*(p + 1) == '.' && (*(p + 2) == '' || *(p + 2) == '/'))
            {
                if (depth > 0)
                {
                    depth--;
                    name_start = 1;
                }
                p += 2;
            }
            else
            {
                indexes[depth++] = p - path;
                while (*p != '/' && *p != '')
                {
                    p++;
                }
            }
            if (*p == '')
            {
                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 = '';
    return result;
}
int main(int argc, char **argv)
{
    if (argc != 2)
    {
        fprintf(stderr, "Usage: ./test path ");
        exit(-1);
    }
    printf("%s ", 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


? 每日一练刷题专栏 ?

持续,努力奋斗做强刷题搬运工!

? 点赞,你的认可是我坚持的动力! 

? 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。