編碼注意部分

 

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都是重量級方法。當我們使用有限次數時,並不會感覺到慢。但是當我們需要重複執行上億次時,就很慢了。
————————————————

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章