【LeetCode & 劍指offer刷題】熟悉OJ平臺2:如何處理輸入問題
阿新 • • 發佈:2019-01-06
【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)
#include <iostream>
using
namespace
std
;
int
main
()
{
int
a
,
b
;
cin
>>
a
>>
b
;
cout
<<
a
+
b
<<
endl
;
//對其他題目,換成要求的複雜處理與輸出
return
0
;
}
/*
輸入多行數時,直到讀至輸入檔案末尾(EOF)為止
說明1:當讀到輸入結束時,cin >> a >> b返回 0,迴圈也結束。
說明2:在除錯程式時,鍵盤輸入的資料,用CTRL-Z(即按住CTRL鍵不放,再按下Z)組合作為輸入結束,此謂鍵盤輸入裝置的“檔案末尾”。
重點掌握
Sample Input
1 5
10 20
400 516
Sample Output
6
30
916
*/
#include <iostream>
using
namespace
std
;
int
main
()
{
int
a
,
b
;
while
(
cin
>>
a
>>
b
)
//當題目輸入行數不確定時使用此方法
{
cout
<<
a
+
b
<<
endl
;
}
return
0
;
}
/*
多組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,每組輸入單獨佔一行。
當輸入為 0 0 時,輸入結束。
Sample Input
1 5
10 20
0 0
Sample Output
6
30
*/
#include<iostream>
using
namespace
std
;
int
main
()
{
int
a
,
b
;
while
(
cin
>>
a
>>
b
&&(
a
||
b
))
{
cout
<<
a
+
b
<<
endl
;
}
return
0
;
}
/*
第一行是資料的組數N,
從第二行是N組由兩個整數(a和b)構成的輸入,a和b之間用空格隔開,每組輸入單獨佔一行
重點掌握
Sample Input
2
1 5
10 20
Sample Output
6
30
*/
#include <iostream>
using
namespace
std
;
int
main
()
{
int
a
,
b
,
n
;
cin >> n;
for
(int
i
=
0
;
i
<
n
;
i
++)
{
cin
>>
a
>>
b
;
//cin以空格或者回車作為輸入輸出分隔符
cout
<<
a
+
b
<<
endl
;
}
return
0
;
}
//
利用檔案重定向提高除錯效率
#include<iostream>
#include<cstdio>
using
namespace
std
;
int
main
()
{
freopen
(
"input.txt"
,
"r"
,
stdin
);
//
將輸入重定向到檔案
input.txt
(注意檔案路徑)
int
a
,
b
;
cin
>>
a
>>
b
;
cout
<<
a
+
b
<<
endl
;
return
0
;
}
//
在執行程式前,將本該由鍵盤輸入的資料,寫到檔案
input.txt
中。而在執行程式時,資料將不再需要人去輸入
參考資料:
https://blog.csdn.net/sxhelijian/article/details/8978850
2 讀取和解析標點字元(如逗號)分隔資料
/*
處理輸入問題:讀取以逗號間隔的數字到陣列中
例:
輸入:1,12,123
陣列a:a[0] = 1,a[1] = 12, a[2] = 123
*/
#include <vector>
#include <iostream>
#include <sstream>
#include <string>
using
namespace
std
;
int
main
()
{
vector
<
int
>
a
;
string s
;
cin
>>
s
;
//讀取輸入字串到s
stringstream input
(
s
);
//將字串s轉化為流
string numstr
;
while
(
getline
(
input
,
numstr
,
','
))
//按逗號分隔為字串(
getline每次讀一個
)
{
a
.
push_back
(
stoi
(
numstr
));
}
return
0
;
}
/* 例子
輸入:
2
19:90:23
23:59:59
輸出:
19:00:23
23:59:59
*/
#include <iostream>
#include <vector>
#include <sstream>
#include <string>
using
namespace
std
;
int
main
()
{
int
n
;
cin
>>
n
;
for
(
int
i
=
1
;
i
<=
n
;
i
++)
{
string numstr
;
string output
;
string inputstr
;
cin
>>
inputstr
;
//
讀取一行字串,方便處理
stringstream input
(
inputstr
);
//
將字串
s
轉化為流
,
用
cin
需要考慮回車問題,用流就比較方便(因為
inputstr
已經跳過回車字元)
int
count
=
1
;
while
(
getline(input, numstr, ':'
))
//getline
會將其分隔轉換為字串
{
int
num
=
stoi
(
numstr
);
//
假設
num
一定為正數
if
(
count
==
1
)
{
if
(
num
>
23
)
numstr
[
0
]
=
'0'
;
output
+=
numstr
+
':'
;
}
else
{
if
(
num
>
59
)
numstr
[
0
]
=
'0'
;
output
+=
numstr
+
':'
;
}
count
++;
}
output
.
pop_back
();
//
移除末尾字元
':'
cout
<<
output
<<
endl
;
}
}*
思路:使用
getline
和 stringstream 以
','
為分隔符來
切分資料
,然後使用標準庫 string 的數值轉換函式例如字串轉整形
stoi
進行解析。
注意:
當資料以空格分隔時,可以直接用cin來讀入!
參考資料:
C++ 讀取和解析逗號分隔資料
筆試中的程式設計題一般用OJ平臺(如牛客網),而這些平臺絕大部分都會要求自己寫輸入部分(不同於leetcode),如果對輸入部分不熟悉的話會浪費很多時間,所以這一部分需熟練掌握。
輸入問題 1 整數輸入問題 //參考博文: ACM題目中輸入資料的處理(C++版) //最簡單的輸入,輸入單行 Sample Input 1 2 Sample Output 3