牛客網 - 2018校招真題

排序 - 愛奇藝

https://www.nowcoder.com/practice/e496d8e885a949d18476b2dea1e594a9?tpId=90&tqId=30794&tPage=1&rp=1&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-rankinghtml

題目描述
牛牛有一個長度爲n的整數序列,牛牛想對這個序列進行重排爲一個非嚴格升序序列。牛牛比較懶惰,他想移動儘可能少的數就完成重排,請你幫他計算一下他最少須要移動多少個序列中的元素。(當一個元素不在它原來所在的位置,這個元素就是被移動了的)
輸入描述:
輸入包括兩行,第一行一個整數n(1 ≤ n ≤ 50),即序列的長度
第二行n個整數x[i](1 ≤ x[i] ≤ 100),即序列中的每一個數
輸出描述:
輸出一個整數,即最少須要移動的元素個數
示例1
輸入
複製
3
3 2 1
輸出
複製
2python

思路:先將數組備份到y,再將x排序,最後逐位比較x與y不一樣的數字個數

 

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring>
using namespace std; #define N 50

int main() { int n, x[N], y[N]; cin>>n; for(int i=0; i<n; i++) cin>>x[i]; memcpy(y, x, n*sizeof(int)); sort(x, x+n); int num = 0; for(int i=0; i<n; i++) { if(x[i] != y[i]) num++; } cout<<num<<endl; return 0; }

補充:ios

C++如何複製數組?c++

1. 字符數組 - strcpy()git

頭文件:#include <string.h> 或者 #include <cstring>web

char *strcpy(char *dest, const char *src) 兩個參數分別是目標數組和源數組,該函數返回一個指向最終的目標字符串 dest 的指針(不過通常並不須要用變量接收,直接strcpy(y, x)便可)。數組

2. int,float,double等數組 - memcpy()app

頭文件:#include <string.h> 或者 #include <cstring>less

memcpy(void *str1, const void *str2, size_t n) 參數分別爲目標數組、源數組、要被複制的字節數。ide

3. 循環賦值

Python 如何複製list?

1. y = a[:]

2. y = x.copy()

Python:

n, x = int(input()), list(map(int, input().split())) y = sorted(x) num = 0 for i in range(n): if x[i] != y[i]: num += 1

print(num)

判斷題 - 愛奇藝

https://www.nowcoder.com/practice/ce5b35929ab84e3a806886d9667be00a?tpId=90&tqId=30790&tPage=1&rp=1&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-ranking

題目描述
牛牛參加了一場考試,考試包括n道判斷題,每作對一道題得到1分,牛牛考試前徹底沒有準備,因此考試只能看緣分了,牛牛在考試中一共猜想了t道題目的答案是"正確",其餘的牛牛猜爲"錯誤"。考試結束後牛牛知道實際上n道題中有a個題目的答案應該是"正確",可是牛牛不知道具體是哪些題目,牛牛但願你能幫助他計算可能得到的最高的考試分數是多少。
輸入描述:
輸入包括一行,一行中有三個正整數n, t, a(1 ≤ n, t, a ≤ 50), 以空格分割
輸出描述:
輸出一個整數,表示牛牛可能得到的最高分是多少。
示例1
輸入
複製
3 1 2
輸出
複製
2

思路:a與t的差值,爲作錯的題目數量,n減去此數,即爲得分
#include<cstdio> #include<iostream>
using namespace std; int main() { int n, t, a; cin>>n>>t>>a; cout<<n - abs(a - t)<<endl; return 0; }

Python:

n, t, a = map(int, input().split()) print(n - abs(t - a))

補充:abs()求絕對值,Python和C++都有

迴文素數 - 愛奇藝

https://www.nowcoder.com/practice/4802faa9afb54e458b93ed372e180f5c?tpId=90&tqId=30793&tPage=1&rp=1&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-ranking

題目描述
若是一個整數只能被1和本身整除,就稱這個數是素數。
若是一個數正着反着都是同樣,就稱爲這個數是迴文數。例如:6, 66, 606, 6666
若是一個數字既是素數也是迴文數,就稱這個數是迴文素數
牛牛如今給定一個區間[L, R],但願你能求出在這個區間內有多少個迴文素數。
輸入描述:
輸入包括一行,一行中有兩個整數(1 ≤ L ≤ R ≤ 1000)
輸出描述:
輸出一個整數,表示區間內迴文素數個數。
示例1
輸入
複製
100 150
輸出
複製
2

Python:

def isPrime(num): if num == 1: return False for i in range(2, num): if num % i == 0: return False return True def isHuiwen(num): s = str(num); s2 = s[::-1] if s == s2: return True else: return False l, r = map(int, input().split()) count = 0 for num in range(l, r+1): if (isPrime(num)): if(isHuiwen(num)): count += 1

print(count)

補充:

sqrt() 函數在 math.sqrt下,因此須要import math   

floatstrbytes 轉int類型,直接使用int 函數就行   PYthon3 類型轉換大全

range(a, b) 的範圍是 a<= num < b, 注意範圍

C++:

#include<cstdio> #include<iostream> #include<cmath> #include<cstring>
using namespace std; bool isPrime(int num); bool isHuiwen(int num); int main() { int l, r, counts = 0; int prime[1000]; memset(prime, 0, sizeof(prime)); cin>>l>>r; for(int i=l; i<=r; i++) { if(isPrime(i)) prime[i] = 1; } for(int i=l; i<=r; i++) { if(prime[i]) { if(isHuiwen(i)) counts++; } } cout<<counts<<endl; return 0; } bool isPrime(int num) { if(num == 1) return false; bool flag = true; for(int i=2; i<=sqrt(num); i++) { if(num%i == 0) { flag = false; break; } } return flag; } bool isHuiwen(int num) { bool flag = true; int digit[5]; int i = -1; while(num) { i++; digit[i] = num % 10; num /= 10; } for(int j=0; j<=i; j++, i--) { if(digit[i] != digit[j]) { flag = false; break; } } return flag; }

 

 

 

操做序列

https://www.nowcoder.com/practice/b53bda356a494154b6411d80380295f5?tpId=90&tqId=30783&tPage=1&rp=1&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-ranking

題目描述
小易有一個長度爲n的整數序列,a_1,...,a_n。而後考慮在一個空序列b上進行n次如下操做:
一、將a_i放入b序列的末尾
二、逆置b序列
小易須要你計算輸出操做n次以後的b序列。
輸入描述:
輸入包括兩行,第一行包括一個整數n(2 ≤ n ≤ 2*10^5),即序列的長度。
第二行包括n個整數a_i(1 ≤ a_i ≤ 10^9),即序列a中的每一個整數,以空格分割。
輸出描述:
在一行中輸出操做n次以後的b序列,以空格分割,行末無空格。
示例1
輸入
複製
4
1 2 3 4
輸出
複製
4 2 1 3

超時代碼:循環 + list.reverse() 

n = int(input()) a = input().split() b = [] for i in range(n): b.append(a[i]) b.reverse() # print(" ".join(str(foo) for foo in b))
print(" ".join(b))

 補充:list.reverse() 用於反向列表中元素。 該方法沒有返回值,可是會對列表的元素進行反向排序。

 超時代碼2:循環 + str[::-1]

n = int(input()) a = input().split() s = ''

for i in range(n): s += a[i] s = s[::-1] print(" ".join(list(s)))

補充:str = str[::-1] 可用於反轉字符串, l = list(str) 用於將字符串分割成字母列表

經過代碼Python:

思路:關鍵是時間複雜度 當n分別爲2 3 4 5 6時看如下幾個輸出: 2 1
3 1 2
4 2 1 3
5 3 1 2 4
6 4 2 1 3 5 因此: n爲奇數(odd)時:輸出爲奇數序列翻轉+偶數序列 n爲偶數(even)時:輸出爲偶數序列翻轉+奇數序列
n = int(input()) a = input().split() odd = a[0::2] even = a[1::2] if n % 2 == 0: even.reverse() even.extend(odd) print(" ".join(even)) else: odd.reverse() odd.extend(even) print(" ".join(odd))

補充:list.extend(seq)  用於在列表末尾一次性追加另外一個序列中的多個值(用新列表擴展原來的列表)。

  • seq -- 元素列表,能夠是列表、元組、集合、字典,若爲字典,則僅會將鍵(key)做爲元素依次添加至原列表的末尾。
  • 該方法沒有返回值,但會在已存在的列表中添加新的列表內容。

奇反+偶 和 偶反+奇 實際上是正好相反的,因此優化一下以下:

n = int(input()) a = input().split() odd = a[0::2] even = a[1::2] out = [] odd.reverse() out.extend(odd) out.extend(even) if n % 2 == 0: out.reverse() print(" ".join(out))
Python

 C++:

#include<cstdio> #include<iostream>
using namespace std; #define MAXN 200001
// const int MAXN = 200200;

int main() { int n, a[MAXN]; cin>>n; for(int i=0; i<n; i++) cin>>a[i]; if(n%2) { for(int i=n-1; i>=0; i-=2) cout<<a[i]<<" "; for(int i=1; i<n-1; i+=2) i == n - 1 ? cout<<a[i] : cout<<a[i]<<" "; } else { for(int i=n-1; i>0; i-=2) cout<<a[i]<<" "; for(int i=0; i<n-1; i+=2) i == n - 1 ? cout<<a[i] : cout<<a[i]<<" "; } return 0; }

 補充:C++ STL有函數能夠實現數組翻轉,不知道在這裏會不會超時

https://blog.csdn.net/hnust_xiehonghao/article/details/9197549

#include<stdio.h> #include <vector> #include <queue> #include<algorithm> 
using namespace std; int main() { int i; vector<int>que; for(i=0;i<10;i++) que.push_back(i); for(i=0;i<10;i++) { printf("%d ",que[i]); } printf("\n"); reverse(que.begin(),que.end()); for(i=0;i<10;i++) { printf("%d ",que[i]); } return  0; } // 上面是對int類型進行倒置 把改爲vector內容改爲char型也能夠 改爲string應該也能夠
例子

交錯01串

https://www.nowcoder.com/practice/3fbd8fe929ea4eb3a254c0ed34ac993a?tpId=90&tqId=30782&tPage=1&rp=1&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-ranking

題目描述
若是一個01串任意兩個相鄰位置的字符都是不同的,咱們就叫這個01串爲交錯01串。例如: "1","10101","0101010"都是交錯01串。
小易如今有一個01串s,小易想找出一個最長的連續子串,而且這個子串是一個交錯01串。小易須要你幫幫忙求出最長的這樣的子串的長度是多少。
輸入描述:
輸入包括字符串s,s的長度length(1 ≤ length ≤ 50),字符串中只包含'0'和'1'
輸出描述:
輸出一個整數,表示最長的知足要求的子串長度。
示例1
輸入
複製
111101111
輸出
複製
3

思路1:雙層循環遍歷
依次以每一個字母做爲起點,日後找最長子串,將最大長度存下來
思路2:單層遍歷便可
從第一個字母開始,日後尋找子串;若中斷(先後兩個字母相等),則用length更新max_length,且length清零;從中斷點開始再日後尋找

 

import sys for line in sys.stdin: line = line.strip() max_length = 1
    for i in range(len(line)): j = i length = 1
        while j < len(line) - 1: if line[j+1] == line[j]: break j += 1 length += 1

        # max_length = length if length > max_length else max_length max_length = max(max_length, length) print(max_length) # 運行時長41ms
import sys for line in sys.stdin: line = line.strip() # 必須加,最後有個換行符
 length = 1 max_length = 1
    for i in range(1, len(line)): if line[i-1] != line[i]: length += 1 max_length = max(max_length, length) else: length = 1

    print(max_length) # 運行時長:24ms

 

#include<cstdio> #include<iostream> #include<string>
using namespace std; int main() { string str; int length = 1, max_length = 1; cin>>str; for(int i=1; i<str.length(); i++) { if(str[i-1] != str[i]) { length++; max_length = length > max_length ? length : max_length; } else { length = 1; } } cout<<max_length<<endl; return 0; }

# 運行時長:4ms

等差數列 - 網易

https://www.nowcoder.com/practice/e11bc3a213d24fc1989b21a7c8b50c3f?tpId=90&tqId=30781&tPage=1&rp=1&ru=/ta/2018test&qru=/ta/2018test/question-ranking

題目描述
若是一個數列S知足對於全部的合法的i,都有S[i + 1] = S[i] + d, 這裏的d也能夠是負數和零,咱們就稱數列S爲等差數列。
小易如今有一個長度爲n的數列x,小易想把x變爲一個等差數列。小易容許在數列上作交換任意兩個位置的數值的操做,而且交換操做容許交換屢次。可是有些數列經過交換仍是不能變成等差數列,小易須要判別一個數列是否能經過交換操做變成等差數列
輸入描述:
輸入包括兩行,第一行包含整數n(2 ≤ n ≤ 50),即數列的長度。
第二行n個元素x[i](0 ≤ x[i] ≤ 1000),即數列中的每一個整數。
輸出描述:
若是能夠變成等差數列輸出"Possible",不然輸出"Impossible"。
示例1
輸入
複製
3
3 1 2
輸出
複製
Possible

思路: 先排序,再比較先後兩個數之差,所有相等便Possible,不然Impossible
n = int(input()) x = list(map(int, input().split())) x = sorted(x) sub = x[1] - x[0] flag = 1

for i in range(n-1): if x[i + 1] - x[i] != sub: flag = 0 break

if flag: print('Possible') else: print("Impossible")
#include<cstdio> #include<iostream> #include<algorithm>
using namespace std; int main() { int n, x[50]; cin>>n; for(int i=0; i<n; i++) cin>>x[i]; sort(x, x+n); int d = x[1] - x[0]; bool flag = true; for(int i=0; i<n-1; i++) { if(x[i+1] - x[i] != d) { flag = false; break; } } if(flag) cout<<"Possible"<<endl; else cout<<"Impossible"<<endl; return 0; }

 

六一兒童節 - 拼多多

https://www.nowcoder.com/practice/d2dfc62bf1ba42679a0e358c57da9828?tpId=90&tqId=30778&tPage=1&rp=1&ru=/ta/2018test&qru=/ta/2018test/question-ranking

題目描述
六一兒童節,老師帶了不少好吃的巧克力到幼兒園。每塊巧克力j的重量爲w[j],對於每一個小朋友i,當他分到的巧克力大小達到h[i] (即w[j]>=h[i]),他纔會上去表演節目。老師的目標是將巧克力分發給孩子們,使得最多的小孩上臺表演。能夠保證每一個w[i]> 0且不能將多塊巧克力分給一個孩子或將一塊分給多個孩子。
輸入描述:
第一行:n,表示h數組元素個數
第二行:n個h數組元素
第三行:m,表示w數組元素個數
第四行:m個w數組元素
輸出描述:
上臺表演學生人數
示例1
輸入
複製
3
2 2 3
2
3 1
輸出
複製
1

思路: 先排序h, w;依次遍歷h,優先知足最小的h

 

n = int(input()) h = list(map(int, input().strip().split())) m = int(input()) w = list(map(int, input().strip().split())) num = 0 h = sorted(h) w = sorted(w) for baby in h: for candy in w: if baby <= candy: w.remove(candy) num += 1
            break

print(num)

 C++:

#include<cstdio> #include<iostream> #include<algorithm>
using namespace std; int main() { int n, m, h[1000], w[1000], num = 0; cin>>n; for(int i=0; i<n; i++) cin>>h[i]; cin>>m; for(int i=0; i<m; i++) cin>>w[i]; sort(h, h+n); sort(w, w+m); int j = -1; for(int i=0; i<n; i++) { while(j<m) { j++; // 放在判斷語句的前面,否則break了以後,j不會自加
            if(h[i] <= w[j]) { num++; break; } } } cout<<num<<endl; return 0; }

補充:

do { 語句; } while (表達式);

do…while 和 while 的執行過程很是類似,惟一的區別是:「do…while 是先執行一次循環體,而後再判別表達式」。當表達式爲「真」時,返回從新執行循環體,如此反覆,直到表達式爲「假」爲止,此時循環結束。

while 循環體內部不必定會執行,當表達式一開始就爲假的時候它就不會執行。但 do…while 無論表達式開始爲真仍是爲假,循環體內部都會先執行一次。

大整數相乘 - 拼多多

https://www.nowcoder.com/practice/0f0badf5f2204a6bb968b0955a82779e?tpId=90&tqId=30777&tPage=1&rp=1&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-ranking

題目描述
有兩個用字符串表示的很是大的大整數,算出他們的乘積,也是用字符串表示。不能用系統自帶的大整數類型。
輸入描述:
空格分隔的兩個字符串,表明輸入的兩個大整數
輸出描述:
輸入的乘積,用字符串表示
示例1
輸入
複製
72106547548473106236 982161082972751393
輸出
複製
70820244829634538040848656466105986748

Python:

num1, num2 = map(int, input().strip().split()) print(str(num1 * num2))

 補充:在Python 3裏,只有一種整數類型 int,表示爲長整型,沒有 python2 中的 Long。 int 類型在python中是動態長度的。由於python3中int類型是長整型,理論支持無限大的數字

菜鳥教程 Python3基礎教程     python中int類數據的內存解析

 C++:

思路: 不管使用char[],仍是使用string,先將兩個數組反轉,這樣方便一點,沒那麼繞 相乘後的位數不會超過len1+len2 好比123456 * 456789
123456
456789 s[i]*s[j] 的結果應該存到ans[i+j]的位置,若是數大於10,則應把10位部分,存到ans[i+j+1] 最後應將數組反轉再輸出

 

#include<cstdio> #include<iostream> #include<string> #include<cstring> #include<algorithm>
using namespace std; int main() { string str1, str2; int len1, len2; cin>>str1>>str2; len1 = str1.length(); //len1 = str1.size();也可
    len2 = str2.length(); int ans[2000]; //相乘結果
    memset(ans, 0, sizeof(ans)); reverse(str1.begin(), str1.end()); //反轉string字符串
 reverse(str2.begin(), str2.end()); for(int i=0; i<len1; i++) { for(int j=0; j<len2; j++) { int mul = (str1[i] - '0') * (str2[j] - '0'); ans[i+j] += (mul % 10); ans[i+j+1] += (mul / 10); } } for(int i=0; i<len1+len2; i++) { ans[i+1] += ans[i] / 10; ans[i] = ans[i] % 10; } int t = len1 + len2 - 1; while(!ans[t]) { t--; //獲取有效結果的長度,由於最後部分爲0
 } while(t>=0) { cout<<ans[t]; t--; } return 0; }

 下面是使用string來存儲結果的一種方法,可是是不能經過的,錯誤緣由應該是在第一個循環

#include<cstdio> #include<iostream> #include<string> #include<algorithm>
using namespace std; int main() { string str1, str2; int len1, len2; cin>>str1>>str2; len1 = str1.length(); len2 = str2.length(); string ans(len1+len2, '0'); reverse(str1.begin(), str1.end()); reverse(str2.begin(), str2.end()); for(int i=0; i<len1; i++) { for(int j=0; j<len2; j++) { int mul = (str1[i] - '0') * (str2[j] - '0'); ans[i+j] += (mul % 10); ans[i+j+1] += (mul / 10); } } for(int i=0; i<len1+len2; i++) { int temp = ans[i] - '0'; ans[i] = temp % 10 + '0'; ans[i+1] = (ans[i+1] - '0') + (temp / 10) + '0'; } reverse(ans.begin(), ans.end()); int pos = ans.find_first_not_of('0'); cout<<ans.substr(pos)<<endl; return 0; }
錯誤代碼

下面是網上別人的方法,string存的

#include <iostream> #include <string> #include <vector> #include <algorithm>
using namespace std; string s1,s2; int main(){ cin>>s1>>s2; int len1 = s1.length(),len2 = s2.length(); string res(len1+len2,'0'); for(int i = len1-1;i>=0;--i){ for(int j = len2-1;j>=0;--j){ int mul = (s1[i] -'0')*(s2[j] - '0'); int sum = mul+(res[i+j+1] -'0'); res[i+j+1] = (sum%10 +'0'); res[i+j] =  (res[i+j] -'0') +sum/10 + '0'; } } int pos = res.find_first_not_of('0'); cout<<res.substr(pos); }
C++

下面是以前在Noj上寫的一個版本:

#include<iostream> #include<cstring>
using namespace std; void multiply(int len1, int len2); int A[1001]; int B[1001]; int mul[2002]; //相乘後的位數不會超過a+b

int main() { char str_A[1001]; char str_B[1001]; int len_A, len_B; int len1, len2; int i, j; while(cin>>str_A && cin>>str_B) { memset(mul,0,sizeof(mul)); len_A = 0; len_B = 0; i = 0; j = 0; while(str_A[len_A] != '\0') { len_A++; //計算A的長度
 } while(str_B[len_B] != '\0') { len_B++; //計算B的長度
 } len1 = len_A; len2 = len_B; while(len_A) { A[i++] = str_A[--len_A] - '0'; //字符數組倒序轉int數組
 } while(len_B) { B[j++] = str_B[--len_B] - '0'; //字符數組倒序轉int數組
 } multiply(len1, len2); } return 0; } void multiply(int len1, int len2) { for(int i=0; i<len1; i++) { for(int j=0; j<len2; j++) { mul[i+j] += A[i] * B[j]; } } int t=0; //mul的下標從0開始,len1和len2是從1開始
    while(t<len1+len2-1 || mul[t]!=0) { if(mul[t] >= 10) { mul[t+1] += mul[t]/10; mul[t] = mul[t]%10; } t++; } while(t>0) { t--; cout<<mul[t]; } // for(int i=t; i>=0; i--) // { // if(t==len1+len2-1) // { // if(mul[t] == 0) // { // ; // } // else // { // cout<<mul[i]; // } // } // else // { // cout<<mul[i]; // } // }
    cout<<endl; } 代碼G
View Code

https://www.cnblogs.com/tanrong/p/9668654.html

 

補充:

C++如何輸入含空格的字符串    頭文件 string.h cstring string 區別   C語言和C++字符串 菜鳥教程  

cin是C++中最經常使用的輸入語句,當遇到空格或者回車鍵即中止,不能輸入帶空格的字符串;使用scanf或者cin.get (char *str, int maxnum)能夠解決

#include <string>  才能夠能夠定義string str;

1)文件cstring,和string.h對應,c++版本的頭文件,包含好比strcpy之類的字符串處理函數
2)文件string.h,和cstring對應,c版本的頭文件,包含好比strcpy之類的字符串處理函數
3)文件string,包含std::string的定義,屬於STL範疇
4)CString,MFC裏的的字符串類

C++字符串反轉  c++中字符串的反轉

1.對於用char定義的字符串:使用string.h中的strrev函數

#include <iostream> #include <cstring>
using namespace std; int main() { char s[]="123456";//不能是string類型;
 strrev(s); cout<<s<<endl; return 0; }
View Code

2.對於string類型的:使用algorithm中的reverse函數

#include<iostream> #include <cstring> #include <algorithm>
using namespace std; int main() { string s[]="123456"; reverse(s.begin(),s.end()); cout<<s<<endl; return 0; }
View Code

3.本身編寫函數:對於字符串的兩邊進行交換。

 C++ string類   C++string類總結

// 能夠用 ==、>、<、>=、<=、和!=比較字符串,能夠用+或者+=操做符鏈接兩個字符串,而且能夠用[]獲取特定的字符 // 可用下列函數來得到string的一些特性:
int capacity()const;    //返回當前容量(即string中沒必要增長內存便可存放的元素個數)
int max_size()const;    //返回string對象中可存放的最大字符串的長度
int size()const;        //返回當前字符串的大小
int length()const;       //返回當前字符串的長度
bool empty()const;        //當前字符串是否爲空
void resize(int len,char c);  //把字符串當前大小置爲len,多去少補,多出的字符c填充不足的部分 // 查找函數
size_type find( const basic_string &str, size_type index );  //返回str在字符串中第一次出現的位置(從index開始查找),若是沒找到則返回string::npos
size_type find( const char *str, size_type index );  // 同上
size_type find( const char *str, size_type index, size_type length );  //返回str在字符串中第一次出現的位置(從index開始查找,長度爲length),若是沒找到就返回string::npos
size_type find( char ch, size_type index );  // 返回字符ch在字符串中第一次出現的位置(從index開始查找),若是沒找到就返回string::npos // 其餘經常使用函數
string &insert(int p,const string &s);  //在p位置插入字符串s
string &replace(int p, int n,const char *s); //刪除從p開始的n個字符,而後在p處插入串s
string &erase(int p, int n);  //刪除p開始的n個字符,返回修改後的字符串
string substr(int pos = 0,int n = npos) const;  //返回pos開始的n個字符組成的字符串
void swap(string &s2);    //交換當前字符串與s2的值
string &append(const char *s);   //把字符串s鏈接到當前字符串結尾
void push_back(char c)   //當前字符串尾部加一個字符c
const char *data()const;   //返回一個非null終止的c字符數組,data():與c_str()相似,用於string轉const char*其中它返回的數組是不以空字符終止,
const char *c_str()const;  //返回一個以null終止的c字符串,即c_str()函數返回一個指向正規C字符串的指針, 內容與本string串相同,用於string轉const char*
經常使用函數

爲C++數組所有賦同一個值的幾種方法:

#include<iostream> #include<cstring>  //memset所需頭文件
using namespace std; int main() { int a[10]={0}; //輸出全0
    int b[10] = {1}; //第一個值爲1,其他爲0,因此不能用這種方式賦所有的值
    int c[10]; int d[10]; int e[10]; memset(c, -1, sizeof(c)); //輸出全爲-1
    memset(c, 0, sizeof(c)); //輸出全爲0

    /**********或者用循環*************************/
    for(int i=0; i<10; i++) d[i] = 6; int j = 0; while(j<10) { e[j] = 8; j++; } for(int i=0; i<10; i++) { //cout<<a[i]<<endl; //cout<<b[i]<<endl; //cout<<c[i]<<endl; //cout<<d[i]<<endl;
        cout<<e[i]<<endl; } return 0; }
C++數組賦值

  

最大乘積 - 拼多多

https://www.nowcoder.com/practice/5f29c72b1ae14d92b9c3fa03a037ac5f?tpId=90&tqId=30776&tPage=1&rp=1&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-ranking

題目描述
給定一個無序數組,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間複雜度:O(n),空間複雜度:O(1)
輸入描述:
無序整數數組A[n]
輸出描述:
知足條件的最大乘積
示例1
輸入
3 4 1 2
輸出
24

思路: 分如下幾種狀況: 先將數組從小到大排列 1. 全爲負數:取後3 2. 負數+0:取後3 3. 整數+0:取後3 4. 負數+正數:最後3個正數 或者 前兩個負數+最後一個正數 因此最終結果爲max(後3, 前2×後3)

 

n = int(input().strip()) # 題目上沒說輸入n呀,看了答案才加了這一行,汗...
 list = list(map(int, input().strip().split())) # list = [int(i) for i in input().strip().split() ]
 list = sorted(list) # list.sort()
try: ans = max(list[-1] * list[-2] * list[-3], list[0] * list[1] * list[-1]) print(ans) except: print(0)

補充:

雖然python3中sort()和sorted()均可以用來排序,但兩者有如下兩個最主要的區別:

1. sort只能應用在列表list上,而sorted能夠對全部可迭代的對象進行排序的操做
2. sort方法會在原list上直接進行排序,不會建立新的list。而sorted()函數只會返回一個排序後的當前對象的副本,而不會改變當前對象。
a.sort()    b = sorted(a)

#include<cstdio> #include<iostream> #include<algorithm>

using namespace std; int main() { int n, num[10000]; long ans; long sum1, sum2; cin>>n; for(int i=0; i<n; i++) { cin>>num[i]; } sort(num, num+n); if(n < 3) ans = 0; else { sum1 = num[n-1] * num[n-2];  // sum1 = num[n-1] * num[n-2] * num[n-3] 這樣連着寫不行,下同
        sum1 *= num[n-3]; sum2 = num[0] * num[1]; sum2 *= num[n-1]; ans = sum1 > sum2 ? sum1 : sum2; // ans = max(sum1, sum2);
 } cout<<ans<<endl; return 0; }

補充:

STL sort()函數: c++sort函數的使用總結

頭文件:#include < algorithm>

語法:sort(begin,end,cmp),cmp參數能夠沒有,若是沒有默認非降序排序。

  • 升序:sort(begin, end, less<data-type>());   eg. sort(begin, end, less<int>());
  • 降序:sort(begin, end, greater<data-type>()).

相似於快排的方法,時間複雜度爲n*log2(n)

相關文章
相關標籤/搜索