1、
char str[1001];
strlen(str);//頭文件include《string.h》
Stack()
1 | boolean empty() 測試堆棧是否爲空。 |
2 | Object peek( ) 查看堆棧頂部的對象,但不從堆棧中移除它。 |
3 | Object pop( ) 移除堆棧頂部的對象,並作爲此函數的值返回該對象。 |
4 | Object push(Object element) 把項壓入堆棧頂部。 |
5 | int search(Object element) 返回對象在堆棧中的位置,以 1 爲基數。 |
還有個add方法,可以指定在指定位置放入數據stack1.add(0,tmp)
vector末尾的添加移除操作
vector.push_back(elem); //在容器尾部加入一個元素。
vector.pop_back(); //移除容器中最後一個元素
例如:
vector<int> vecInt;
vecInt.push_back(1); vecInt.push_back(3);
vecInt.push_back(5);vecInt.push_back(7);
vecInt.push_back(9);
此時容器vecInt就包含了按順序的1,3,5,7,9元素。
如果在此基礎上再運行語句vecInt.pop_back();
vecInt.pop_back();此時容器vecInt就包含了按順序的1,3,5元素。
Arrays.sort(array);//java中對數組進行排序 小於7個元素用的插入排序,大於的話使用的是快速排序
return
array[
0
];
2、char類型的輸入時候,會忽略前面的空格,in空字符(包括回車,TAB,空格)都會當成一個輸入的結束。連續的空字符會被忽略
char a[1000];
cin.getline(a, 1000);
這樣會將空格也算進去,不然12 3 那麼3是存不進去的,遇到空格當作結束了
3、
string s = str; //char轉化爲string
count1 = s.find("P");//find是string類裏面的,返回下標
4、system("pause")不能有
5、有的數組的大小需要根據輸入的n去定
法1 int a = (int)malloc(n * sizeof(int));//動態申請數組空間
for (int i = 0; i < n; i++) { cin >> a[i];
}
法2 vector v(k);//定義一個動態數組,大小爲k
vector result;//定義一個空的動態數組
for(int i=0;i<k;i++){
scanf("%d", &v[i]);
}
6、輸入的方式不同
有的是直接就一個數組,cin直接連着輸入即可,集中處理數組
cin >> n;
int *a = (int*)malloc(n * sizeof(int));//動態申請數組空間
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
for (int j = 0; j < n; j++)
{
int d = a[j];
..................
}
有的是輸入一個,隨機處理數據,在輸入,在處理
vector<int> v(k);//定義一個動態數組,大小爲k
vector<int> result;//定義一個空的動態數組
for(int i=0;i<k;i++){
cin>>v[i];//這個是輸入一個檢測一回,不是輸入完才檢測的
n = v[i];
while(n != 1){
if(n % 2 == 0){
n /= 2;
if(flag[n] == true){
break;
.............
}
stack<string>a; string s; int n=0; while (cin>>s)//ctrl+z 再按回車纔會結束輸入,正常每輸入一個就要回車一次,空格也會被當成字符串 { a.push(s); n++; }
我們先來看一段輸入流cin>>和getline混用的代碼:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int age;
string name;
cout<<"請輸入年齡:"<<endl;
cin>>age;
cout<<"請輸入姓名:"<<endl;
getline(cin,name);
cout<<"年齡:"<<age<<endl;
cout<<"姓名:"<<name<<endl;
return 0;
}
不難看出這段代碼的初衷是通過輸入流、輸入流提取運算符cin>>和getline分別從命令行獲取年齡age和姓名name,但是運行後的結果如下:
可以看出並沒有得到我們期望的結果,輸入姓名的代碼沒有等待用戶輸入就被跳過。
我們先看下cin>>與getline的工作方式,流提取運算符根據它後面的變量類型讀取數據,從非空白符號開始,遇到Enter、Space、Tab鍵時結束。getline函數從istream中讀取一行數據,當遇到“\n”時結束返回。
getline(cin,str)的讀取原理是將以‘/n’爲結束符做爲一完整讀取的一行,'/n'會讀。所以當之前用cin讀取一個字符的時候,你會輸入一個字符然後點擊回車,那麼下面getline(cin,str)讀的時候會讀入這個回車,並判斷結束了。
造成程序錯誤結果的原因是,用戶輸入完年齡後按回車結束輸入,把“\n”留在了輸入流裏,而cin不會主動刪除輸入流內的換行符,這樣換行符就被getline讀取到,getline遇到換行符返回,因此程序不會等待用戶輸入。
解決的辦法是手動清除換行符,在cin>>後加上
cin.ignore();
這樣即可得到正確結果:
因此在使用getline函數之前要注意,輸入流中是否有可能會有換行符,如果有則使用cin.ignore清除。
注意點2:
C++中vector頭文件中有push_back這一函數,作用是在vector尾部加入一個數據。string中也有這個函數,作用是在字符串結尾插入一個字符。
注意點3:
length 和size後面的()不要掉(新手)
7、vectore爲什麼不可以強行賦值
可以這麼理解
vector<int> a;
並沒有開闢一段存放數據的空間,這時候 a.size() 爲0,換個角度,如果一個數組大小爲0,必然不能往這個數組裏寫數據
兩種方式
一種是push_back()
vector<int> a;
a.push_back(0);
a.push_back(1);
這時候a[0] == 0, a[1] == 1
另一種是在定義vector的時候指定一個大小
vector<int> a(10, 0);
a[0] = 1;
將a[0]的值由0改爲1
vector<vector<int> > array
int row = array.size();
int col = array[0].size();
int i,j;
for (i=0,j=col-1;i<row && j>=0;)
{
if (array[i][j] == target)
{
8、string和int的轉換
一個非常好用的方法,使用stringstream,個人理解:可以把stringstream理解爲一個容器,輸入進去一種類型,可以以另一種類型形式輸出,例如下代碼就實現了string到int的轉換,注意複用時要clear一下,另外要包含頭文件<sstream>
#include<iostream>
#include<sstream>
using namespace std;
int main(){
stringstream ss;
string s="55";
string s2="666";
int x;
ss<<s;
ss>>x; //x爲55
cout<<x<<endl;
ss.clear();
ss<<s2;
ss>>x; //x爲666
cout<<x<<endl;
return 0;
}
找到一個大佬對stringstream較詳細的講解,附上鍊接供大家學習string和stringstream用法總結,本菜雞目前掌握到這刷題就夠用了。
刷oj更常用的是下面這個方法
string s="123";
int a=atoi(s.c_str());
如果string不是數字形式的則轉換結果爲0。
————————————————
int轉爲string
string aaa = to_string(result / i);
string bbb= to_string(i);
或者用
String.valueOf(i)
對於string類型變量,我們可以直接用“+”或者“+=”進行字符串的連接,操作符非常方便。
用“+”風格字符串進行字符串連接時,操作符左右兩邊既可以都是string字符串,也可以是一個string字符串和一個C風格的字符串,還可以是一個string字符串和一個char字符。
而用“+=”風格字符串進行字符串連接時,操作符右邊既可以是一個string字符串,也可以是一個C風格字符串或一個char字符。
上述兩種方法:左邊必須是string字符串。
對於string類型變量,我們可以直接用“+”或者“+=”進行字符串的連接,操作符非常方便。用“+”風格字符串進行字符串連接時,操作符左右兩邊既可以都是string字符串,也可以是一個string字符串和一個C風格的字符串,還可以是一個string字符串和一個char字符。而用“+=”風格字符串進行字符串連接時,操作符右邊既可以是一個string字符串,也可以是一個C風格字符串或一個char字符。
例1:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2, s3;
s1 = "first";
s2 = "second";
s3 = s1 + s2;
cout<< s3 <<endl;
s2 += s1;
cout<< s2 <<endl;
s1 += "third";
cout<< s1 <<endl;
s1 += 'a';
cout<< s1 <<endl;
return 0;
}
str.contains("3") 檢查包含
求解奇數序列中,3出現的次數
我們看到這個數值866278171,爲8億多,去掉偶數,只看奇數,也有4億多。
問這4億個數中3出現了多少次,這個問題有點費解。
方式一 暴力破解
所謂暴力破解,就是遍歷每一個數值,統計3出現的次數。下面的各個版本僅供參考:
該方案耗時:2m 52s 139ms
// 奇數序列中,一共出現了多少次3
int number = 866278171;
int sum = 0;
for (int i = 1; i <= number; i = i + 2) {
sum += String.valueOf(i).replace("3", "_#_")
.split("#")
.length - 1;
}
// 總數: 441684627
System.out.println("總數: " + sum);
該方案耗時:1m 41s 259ms
// 奇數序列中,一共出現了多少次3
int number = 866278171;
int sum = 0;
for (int i = 1; i <= number; i = i + 2) {
String str = String.valueOf(i);
if (str.contains("3")) {
sum += str.length() - str.replace("3", "").length();
}
}
// 總數: 441684627
System.out.println("總數: " + sum);
該方案耗時:22s 942ms
// 奇數序列中,一共出現了多少次3
int number = 866278171;
int sum = 0;
for (int i = 1; i <= number; i = i + 2) {
String str = String.valueOf(i);
for (int j = 0; j < str.length(); j++) {
if (str.charAt(j) == '3') {
sum++;
}
}
}
// 總數: 441684627
System.out.println("總數: " + sum);
該方案耗時:6s 669ms
// 奇數序列中,一共出現了多少次3
int number = 866278171;
int sum = 0;
for (int i = 1; i <= number; i = i + 2) {
int k = i;
while (k > 1) {
if (k % 10 == 3) {
sum++;
}
k /= 10;
}
}
// 總數: 441684627
System.out.println("總數: " + sum);
我們看到,走了好多的彎路,String類中的replace和contains都是重量級方法。當我們使用有限次數時,並不會感覺到慢。但是當我們需要重複執行上億次時,就很慢了。
————————————————