力扣每日一題
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;
}