天天看點

2021-09-21每日刷題打卡P1319 壓縮技術P1320 壓縮技術(續集版)

力扣每日一題

58. 最後一個單詞的長度

給你一個字元串 s,由若幹單詞組成,單詞前後用一些空格字元隔開。傳回字元串中最後一個單詞的長度。

單詞 是指僅由字母組成、不包含任何空格字元的最大子字元串。

示例 1:

輸入:s = "Hello World"

輸出:5

建立一個整型變量num計算最後一個單詞的長度,把字元串從最後一個索引往前周遊,遇到字母則num++,一旦遇到空格就結束周遊,輸出num。因為結尾第一個字元也可能是空格,是以加一個判斷,遇到空格是判斷num是否為0,如果不為0就輸出num,如果為0跳過這個空格周遊下一個字元。

class Solution {
public:
    int lengthOfLastWord(string s) {
        int num=0;
        for(int i=s.size()-1;i>=0;i--){
            if(s[i]==' '){
                if(num==0){
                    continue;
                }else{
                    return num;
                }
            }else{
                num++;
            }
        }
        return num;
    }
};
           

洛谷 

P1319 壓縮技術

題目描述

設某漢字由N × N的0和1的點陣圖案組成。

我們依照以下規則生成壓縮碼。連續一組數值:從漢字點陣圖案的第一行第一個符号開始計算,按書寫順序從左到右,由上至下。第一個數表示連續有幾個0,第二個數表示接下來連續有幾個1,第三個數再接下來連續有幾個0,第四個數接着連續幾個1,以此類推……

例如: 以下漢字點陣圖案:

0001000
0001000
0001111
0001000
0001000
0001000
1111111
           

對應的壓縮碼是: 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一個數是N ,其餘各位表示交替表示0和1 的個數,壓縮碼保證 N × N=交替的各位數之和)

既然輸出結果這麼花,那我們就用二維數組來實作,建立一個vector<int>v來存放所有的1和0,建立一個vector<vector<int>>chinese來存放v。還建立了一個vector<int>math來存放壓縮密碼。寫一個while循環接收壓縮密碼,當壓縮密碼總和等于n*n結束接收,用一個for循環周遊math,裡面嵌套一個while來往v裡輸入1或0,既然一開始是從0開始的,那麼加一個判斷,如果math[i]中的i是偶數,輸入0,若是奇數輸入1.每插入一個數對v進行判斷,若v.size()==n,将v存入chinese,同時清空v。最後對chinese周遊輸出

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<list>
#include<string>
#include<map>
#include <set> 
#include <iomanip>

int main()
{
	int n,l=0,num,sum=0,score;
	cin >> n;
	vector<vector<int>>chinese;
	vector<int>v;
	vector<int>math;
	while (sum!=n*n)
	{
		cin >> num;
		sum += num;
		math.push_back(num);
	}
	l = n;
	while (l--)
	{
		for (int i = 0; i < math.size(); i++)
		{
			score = math[i];
			if (i % 2 == 0)
			{
				while (score--)
				{
					v.push_back(0);
					if (v.size() == n)
					{
						chinese.push_back(v);
						v.clear();
					}
				}
			}
			else
			{
				while (score--)
				{
					v.push_back(1);
					if (v.size() == n)
					{
						chinese.push_back(v);
						v.clear();
					}
				}
			}
		}
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < chinese[i].size(); j++)
		{
			cout << chinese[i][j];
		}
		cout << endl;
	}

	return 0;
}
           

P1320 壓縮技術(續集版)

題目描述

設某漢字由N × N的0和1的點陣圖案組成。

我們依照以下規則生成壓縮碼。連續一組數值:從漢字點陣圖案的第一行第一個符号開始計算,按書寫順序從左到右,由上至下。第一個數表示連續有幾個0,第二個數表示接下來連續有幾個1,第三個數再接下來連續有幾個0,第四個數接着連續幾個1,以此類推……

例如: 以下漢字點陣圖案:

0001000
0001000
0001111
0001000
0001000
0001000
1111111
           

對應的壓縮碼是: 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一個數是N ,其餘各位表示交替表示0和1 的個數,壓縮碼保證 N×N = 交替的各位數之和)

輸入格式

漢字點陣圖(點陣符号之間不留白格)。(3<=N<=200)

輸出格式

一行,壓縮碼。

(好家夥還有續集)條件和上一題一樣,隻不過是倒過來,上一題是給壓縮密碼輸出文字,這題是給文字輸出壓縮密碼。這裡我用來接收文字的是字元串不是數組,沒啥好說的,上一題會了這一題自然也不難。注意就是第一個壓縮密碼必須是0的,如果文字是從1開始的,那就要先在存儲密碼的容器前先插入一個數字0,代表一開始沒有‘0’。

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<list>
#include<string>
#include<map>
#include <set> 
#include <iomanip>

int main()
{
	int num1=0,num0=0, n, l = 1,sum=0;
	string str;
	vector<int>math;

	do
	{
		cin >> str;
		n = str.size();
		sum += str.size();
		for (int i = 0; i < str.size(); i++)
		{
			if (str[i] == '1')
			{
				if (num0 != 0)
				{
					math.push_back(num0);
					num0 = 0;
				}
				num1++;
			}
			else
			{
				if (num1 != 0)
				{
					if (math.size() == 0)
					{
						math.push_back(0);
					}
					math.push_back(num1);
					num1 = 0;
				}
				num0++;
			}
		}
		
		str.clear();

	} while (sum != n * n);
	if (num1 != 0)
	{
		if (math.size() == 0)
		{
			math.push_back(0);
		}
		math.push_back(num1);
	}
	else if (num0 != 0)
	{
		math.push_back(num0);
	}
	cout << n << " ";
	for (int i = 0; i < math.size(); i++)
	{
		cout << math[i] << " ";
	}
	

	return 0;
}
           

繼續閱讀