卡玛网训练(ACM模式)-代码随想录

卡玛网33.逛街

思路一:

                1.先将输入字符转换为int数组
                2.使用栈从0遍历数组,保存第i位之前可以连续降序的数值
                3.使用栈从n-1遍历数组,保存第i位之后可以连续降序的数值
                4.及时更新第i个位置前后存在的到达i之前连续降序的数值个数
#include 
#include 
#include 
#include 
#include 
using namespace std;
vector parseIntArray(string input) {//获取高度数组
    vector parsedArray;
    stringstream ss(input.substr(1, input.length() - 2));//使用字符串流stringstream处理输入字符串,并把头尾的括号去掉
    string item;
    while (getline(ss, item, ',')) {//使用getline从stringstream中按逗号分割获取每个字符串元素
        parsedArray.push_back(std::stoi(item));//将字符串元素转为数字
    }
    return parsedArray;
}

void calculateVisibleCounts(const vector& heights, vector& visibleCounts) {
    int n = heights.size();
    stack stack1, stack2;

    for (int i = 0; i < n; i++) {//从左往右找(相当于看第i位左边符合条件的)
        visibleCounts[i] += stack1.size();//降序排列的数值,就是从当前位置起栈里的都能看到,当前位置的初始化已经加上
        while (!stack1.empty() && stack1.top() <= heights[i]) {//第i位元素是否大于等于前面的元素时,把前面的元素弹出
            stack1.pop();                                      //直到找到一个比当前元素大的值,或者栈空
        }                                                      //使得栈中的元素全是按降序排列的(从底到顶)
        stack1.push(heights[i]);//把当前位置加入
    }

    for (int i = n - 1; i >= 0; i--) {//从右往左找(相当于看第i位右边符合条件的
        visibleCounts[i] += stack2.size();//同理把从右往左能看到的都加上
        while (!stack2.empty() && stack2.top() <= heights[i]) {//等于的时候也要弹出,因为等于也看不见
            stack2.pop();//也是形成降序排列
        }
        stack2.push(heights[i]);
    }
}

int main() {
    string buildings;
    while(getline(cin, buildings)){
        vector heights = parseIntArray(buildings);
        int n = heights.size();
        vector visibleCounts(n, 1);//初始化都为1,因为在第i个位置上,必然能看到第i个位置
        calculateVisibleCounts(heights, visibleCounts);
        cout << "[";
        for (int i = 0; i < n; i++) {
            cout << visibleCounts[i];
            if (i < n - 1) 
                cout << ",";
        }
        cout << "]" <

卡玛网13.镂空三角形

思路:根据题意,可以把结果分成四个部分

                1.打印空格(空格的数量是递减的,且最后一行不需要)

                2.打印字符(相当于左侧字符,前n-1行都只需打印一个,最后一行需打印n个)

                3.打印空格(属于中间空格,发现符合2*i-1的规律递增,最后一行无需打印)

                4.打印字符(相当于右侧字符,第一行无需打印,2到n-1行打印一个,最后一行打印n-1个

#include
#include
using namespace std;
int main() {
    string str;
    while (getline(cin, str)) {
        stringstream ss(str);
        char midC;
        
        int midI;
        ss >> midC;
        if (midC == '@')
            break;
        ss >> midI;
        for (int i = 0; i < midI; i++) {
            //打印空格
            int midP = midI - i-1;
            while (midP--)
                cout << ' ';
            //打印字符
            int midS = midI;
            if (i != midI - 1)
                cout << midC;
            else {
                while (midS--)
                    cout << midC;
            }
            //打印空格
            if (i != midI - 1 && i!=0) {
                int midC1 = 2 * i-1 ;
                while (midC1--)
                    cout << ' ';
            }
            
            //打印字符
            if (i == 0) {
                cout << endl;
                continue;

            }
                
            int midC2 = midI;
            if (i != midI - 1)
                cout << midC;
            else {
                midC2--;
                while (midC2--)
                    cout << midC;
            }
            cout << endl;
        }
        cout << endl;
    }
    return 0;
}

你可能感兴趣的:(算法学习,代码随想录算法训练营(19期),C++,算法,leetcode,数据结构)