├── .gitignore ├── sword2offer ├── 52.cpp ├── Template.cpp ├── 38.TreeDepth.cpp ├── 11.NumberOf1.cpp ├── 18.Mirror.cpp ├── 48.Add.cpp ├── 47.Sum_Solution.cpp ├── 34.FirstNotRepeatingChar.cpp ├── 8.jumpFloor.cpp ├── 7.Fibonacci.cpp ├── 10.rectCover.cpp ├── 15.ReverseList.cpp ├── 9.jumpFloorII.cpp ├── 30.FindGreatestSumOfSubArray.cpp ├── 51.multiply.cpp ├── 32.PrintMinNumber.cpp ├── 3.printListFromTailToHead.cpp ├── 49.StrToInt.cpp ├── 54.FirstAppearingOnce.cpp ├── 43.LeftRotateString.cpp ├── 1.Find.cpp ├── 22.PrintFromTopToBottom.cpp ├── 58.isSymmetrical.cpp ├── 20.minStack.cpp ├── 14.FindKthToTail.cpp ├── 55.EntryNodeOfLoop.cpp ├── 62.KthNode.cpp ├── 40.FindNumsAppearOnce.cpp ├── 5.twoStack.cpp ├── 13.reOrderArray.cpp ├── 45.IsContinuous.cpp ├── 39.IsBalanced_Solution.cpp ├── 42.FindNumbersWithSum.cpp ├── 46.LastRemaining_Solution.cpp ├── 21.IsPopOrder.cpp ├── 2.replaceSpace.cpp ├── 29.GetLeastNumbers_Solution.cpp ├── 44.ReverseSentence.cpp ├── 27.Permutation.cpp ├── 33.GetUglyNumber_Solution.cpp ├── 16.Merge.cpp ├── 50.duplicate.cpp ├── 28.MoreThanHalfNum_Solution.cpp ├── 56.deleteDuplication.cpp ├── 12.Power.cpp ├── 63.GetMedian.cpp ├── 64.maxInWindows.cpp ├── 23.VerifySquenceOfBST.cpp ├── 6.minNumberInRotateArray.cpp ├── 41.FindContinuousSequence.cpp ├── 26.Convert.cpp ├── 17.HasSubtree.cpp ├── 60.Print.cpp ├── 24.FindPath.cpp ├── 61.Serialize.cpp ├── 53.isNumeric.cpp ├── 36.FindFirstCommonNode.cpp ├── 19.printMatrix.cpp ├── 37.GetNumberOfK.cpp ├── 66.movingCount.cpp ├── 57.match.cpp ├── 59.Print.cpp ├── 31.NumberOf1Between1AndN_Solution.cpp ├── 25.Clone.cpp ├── 35.InversePairs.cpp ├── 65.hasPath.cpp └── 4.reConstructBinaryTree.cpp ├── leetcode ├── 16.candy.cpp ├── Template.cpp ├── 15.singleNumber.cpp ├── 1.minDepth.cpp ├── 10.hasCycle.cpp ├── 14.singleNumber2.cpp ├── 7.preorderTraversal.cpp ├── 12.wordBreak.cpp ├── 18.cloneGraph.cpp ├── 17.canCompleteCircuit.cpp ├── 9.detectCycle.cpp ├── 5.insertionSortList.cpp ├── 6.postorderTraversal.cpp ├── 20.partition.cpp ├── 19.minCut.cpp ├── 2.evalRPN.cpp ├── 3.maxPoints.cpp ├── 13.copyRandomList.cpp ├── 11.wordBreak2.cpp ├── 8.reorderList.cpp └── 4.sortList.cpp ├── resources ├── 5583018-1.png ├── 6910869-1.png ├── 8537140-1.png ├── 8537140-2.png ├── 8537140-3.png └── 8537279-1.jpg ├── wangyi-4111169 ├── 4.race.cpp ├── 1.stringCode.cpp ├── ReadMe.md ├── 2.maxSum.cpp └── 3.pushBox.cpp ├── iqiyi-8246859 ├── 1.grassGame.cpp ├── 3.luckSubSequence.cpp ├── 2.boringCattleSheep.cpp └── ReadMe.md ├── meituan-5583018 ├── 1.monopoly.cpp ├── 2.countWays.cpp ├── 3.maxRectangleArea.cpp ├── 4.maxSubString.cpp └── ReadMe.md ├── wangyi-9763997 ├── 2.magicArray.cpp ├── 4.gotoClass.cpp ├── 7.alarm.cpp ├── 3.streetLight.cpp ├── 8.bag.cpp ├── 6.rectangle.cpp ├── 1.job.cpp └── ReadMe.md ├── wangyi-4575457 ├── 7.set.cpp ├── 8.strangeFormula.cpp ├── 10.rememberWord.cpp ├── 4.clearRepeat.cpp ├── 2.gotoCompany.cpp ├── 3.adjustLine.cpp ├── 12.cookie.cpp ├── 6.workSchedule.cpp ├── 1.doubleCore.cpp ├── 9.paintBoard.cpp ├── 11.pileBricks.cpp ├── 5.magicRing.cpp └── ReadMe.md ├── iqiyi-8246915 ├── 1.bracketsDepth.cpp ├── 2.cow.cpp ├── 3.squareString.cpp └── ReadMe.md ├── wangyi-2811407 ├── 8.guessCandy.cpp ├── 6.maxOddDivisor.cpp ├── 2.elegantPoint.cpp ├── 7.buyApple.cpp ├── 4.badStrings.cpp ├── 3.jumpStone.cpp ├── 1.palindromeSequence.cpp ├── 5.reverseNumber.cpp └── ReadMe.md ├── tengxun-5582994 ├── 4.geohash.cpp ├── 1.code.cpp ├── 2.gameTask.cpp ├── 3.primePair.cpp └── ReadMe.md ├── nowcoder-9439037 ├── 1.encrypt.cpp ├── 5.goodArray.cpp ├── 3.taxi.cpp ├── 4.crystalRing.cpp ├── 2.swamp.cpp ├── 6.braveCow.cpp └── ReadMe.md ├── iqiyi-8246879 ├── 1.missBrackets.cpp ├── 2.lastNumber.cpp ├── 3.bubbleSort.cpp └── ReadMe.md ├── wangyi-6910869 ├── 1.magicCoin.cpp ├── 3.stringFragment.cpp ├── 5.resortArray.cpp ├── 7.chorus.cpp ├── 6.bracketsLCS.cpp ├── 2.oppositeNumber.cpp ├── 8.shootingGame.cpp ├── 4.magicCountry.cpp └── ReadMe.md ├── tengxun-1725829 ├── 2.charShift.cpp ├── 1.palindrome.cpp ├── ReadMe.md └── 3.funnyNumber.cpp ├── toutiao-8537039 ├── 3.room.cpp ├── 2.maxABString.cpp ├── ReadMe.md └── 1.football.cpp ├── wangyi-2385858 ├── 2.originSequence.cpp ├── 1.shuffle.cpp └── ReadMe.md ├── toutiao-8537279 ├── 1.maxPoints.cpp ├── 2.maxArrayValue.cpp ├── ReadMe.md └── 3.pmIdea.cpp ├── toutiao-8537209 ├── 2.strings.cpp ├── 3.maxSameString.cpp ├── 1.favourite.cpp └── ReadMe.md ├── toutiao-8537140 ├── 3.room.cpp ├── ReadMe.md ├── 1.cube.cpp └── 2.pushBox.cpp └── ReadMe.md /.gitignore: -------------------------------------------------------------------------------- 1 | out/ 2 | .vscode/ -------------------------------------------------------------------------------- /sword2offer/52.cpp: -------------------------------------------------------------------------------- 1 | //Name 2 | //https://www.nowcoder.com/practice/ 3 | class Solution { 4 | }; -------------------------------------------------------------------------------- /leetcode/16.candy.cpp: -------------------------------------------------------------------------------- 1 | //Name 2 | //https://www.nowcoder.com/practice/ 3 | class Solution { 4 | }; -------------------------------------------------------------------------------- /leetcode/Template.cpp: -------------------------------------------------------------------------------- 1 | //Name 2 | //https://www.nowcoder.com/practice/ 3 | class Solution { 4 | }; -------------------------------------------------------------------------------- /resources/5583018-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reyzal2018/nowcoder/HEAD/resources/5583018-1.png -------------------------------------------------------------------------------- /resources/6910869-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reyzal2018/nowcoder/HEAD/resources/6910869-1.png -------------------------------------------------------------------------------- /resources/8537140-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reyzal2018/nowcoder/HEAD/resources/8537140-1.png -------------------------------------------------------------------------------- /resources/8537140-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reyzal2018/nowcoder/HEAD/resources/8537140-2.png -------------------------------------------------------------------------------- /resources/8537140-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reyzal2018/nowcoder/HEAD/resources/8537140-3.png -------------------------------------------------------------------------------- /resources/8537279-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reyzal2018/nowcoder/HEAD/resources/8537279-1.jpg -------------------------------------------------------------------------------- /sword2offer/Template.cpp: -------------------------------------------------------------------------------- 1 | //Name 2 | //https://www.nowcoder.com/practice/ 3 | class Solution { 4 | }; -------------------------------------------------------------------------------- /wangyi-4111169/4.race.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | int main() 5 | { 6 | double result = 0; 7 | int n; 8 | cin >> n; 9 | while (n--) 10 | { 11 | result += 1.0 / (n + 1); 12 | } 13 | printf("%.4lf", result); 14 | return 0; 15 | } -------------------------------------------------------------------------------- /sword2offer/38.TreeDepth.cpp: -------------------------------------------------------------------------------- 1 | //二叉树的深度 2 | //https://www.nowcoder.com/practice/435fb86331474282a3499955f0a41e8b 3 | class Solution { 4 | public: 5 | int TreeDepth(TreeNode* pRoot) 6 | { 7 | if(pRoot == NULL) return 0; 8 | return max(TreeDepth(pRoot->left),TreeDepth(pRoot->right))+1; 9 | } 10 | }; -------------------------------------------------------------------------------- /leetcode/15.singleNumber.cpp: -------------------------------------------------------------------------------- 1 | //single-number 2 | //https://www.nowcoder.com/practice/0bc646909e474ac5b031ec6836a47768 3 | class Solution { 4 | public: 5 | int singleNumber(int A[], int n) { 6 | int res = 0; 7 | for(int i = 0;ileft,pRoot->right); 8 | Mirror(pRoot->left); 9 | Mirror(pRoot->right); 10 | } 11 | }; -------------------------------------------------------------------------------- /iqiyi-8246859/1.grassGame.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | 4 | int main() 5 | { 6 | int status[] = { 0,1,0, 1, 1, 0, 1, 0, 1, 1 }; 7 | int t; 8 | cin >> t; 9 | while (t--) 10 | { 11 | int n; 12 | cin >> n; 13 | cout << (status[n % 10] == 1 ? "niu" : "yang") << endl; 14 | } 15 | return 0; 16 | } -------------------------------------------------------------------------------- /sword2offer/48.Add.cpp: -------------------------------------------------------------------------------- 1 | //不用加减乘除做加法 2 | //https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215 3 | class Solution { 4 | public: 5 | int Add(int num1, int num2) 6 | { 7 | while(num2){ 8 | int tmp = num1; 9 | num1 = num1 ^ num2; 10 | num2 = (tmp & num2)<<1; 11 | } 12 | return num1; 13 | } 14 | }; -------------------------------------------------------------------------------- /meituan-5583018/1.monopoly.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | using namespace std; 5 | int main() 6 | { 7 | int n; 8 | cin>> n; 9 | vector dp(n+1); 10 | dp[0] = 1; 11 | dp[1] = 1; 12 | int sum = 0; 13 | for(int i = 2;i<=n;i++){ 14 | sum += dp[i-2]; 15 | dp[i] = 2*sum; 16 | } 17 | cout < 2 | using namespace std; 3 | 4 | int getCount(int n) { 5 | if (n % 3 == 0) 6 | return 2 * (n / 3); 7 | else 8 | return 2 * (n / 3) + n % 3 - 1; 9 | } 10 | 11 | //找规模 12 | int main() { 13 | int l, r; 14 | cin >> l >> r; 15 | cout << getCount(r) - getCount(max(l - 1, 0)) << endl; 16 | return 0; 17 | } -------------------------------------------------------------------------------- /wangyi-4575457/7.set.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int w, x, y, z; 8 | cin >> w >> x >> y >> z; 9 | set s; 10 | for (int p = w; p <= x; p++) 11 | { 12 | for (int q = y; q <= z; q++) 13 | { 14 | s.insert(1.0*p / q); 15 | } 16 | } 17 | cout << s.size() << endl; 18 | return 0; 19 | } -------------------------------------------------------------------------------- /sword2offer/47.Sum_Solution.cpp: -------------------------------------------------------------------------------- 1 | //求1+2+3+...+n 2 | //https://www.nowcoder.com/practice/7a0da8fc483247ff8800059e12d7caf1 3 | typedef int(*FUN)(int); 4 | FUN f[2]; 5 | static int fun(int n) { 6 | return n + f[!n](n - 1); 7 | } 8 | static int endFun(int n) { 9 | return 0; 10 | } 11 | class Solution { 12 | public: 13 | int Sum_Solution(int n) { 14 | f[0] = fun; 15 | f[1] = endFun; 16 | return fun(n); 17 | } 18 | }; -------------------------------------------------------------------------------- /sword2offer/34.FirstNotRepeatingChar.cpp: -------------------------------------------------------------------------------- 1 | //第一个只出现一次的字符 2 | //https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c 3 | class Solution { 4 | public: 5 | int FirstNotRepeatingChar(string str) { 6 | map m; 7 | for(auto& it:str) 8 | m[it]++; 9 | for(int i = 0;i 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | string s; 10 | cin >> s; 11 | int depth = 0; 12 | int maxdepth = 0; 13 | for (auto& it : s) { 14 | if (it == '(') { 15 | depth++; 16 | maxdepth = max(maxdepth, depth); 17 | } 18 | else { 19 | depth--; 20 | } 21 | } 22 | cout << maxdepth << endl; 23 | return 0; 24 | } -------------------------------------------------------------------------------- /leetcode/1.minDepth.cpp: -------------------------------------------------------------------------------- 1 | //minimum-depth-of-binary-tree 2 | //https://www.nowcoder.com/practice/e08819cfdeb34985a8de9c4e6562e724 3 | class Solution { 4 | public: 5 | int run(TreeNode *root) { 6 | if(root == NULL) return 0; 7 | int left = run(root->left); 8 | int right = run(root->right); 9 | if(left == 0 || right == 0) 10 | return left + right + 1; 11 | return min(left,right)+1; 12 | } 13 | }; -------------------------------------------------------------------------------- /sword2offer/7.Fibonacci.cpp: -------------------------------------------------------------------------------- 1 | //斐波那契数列 2 | //https://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3 3 | class Solution { 4 | public: 5 | int Fibonacci(int n) { 6 | //1 1 2 3 ... 7 | if(n < 2) return n; 8 | int pre = 1; 9 | int pre_pre = 1; 10 | for(int i = 2;i 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int x[4]; 8 | cin >> x[0] >> x[1] >> x[2] >> x[3]; 9 | int A = (x[0] + x[2]) / 2; 10 | int B = A - x[0]; 11 | int C = x[3] - B; 12 | if (A - B == x[0] && B - C == x[1] && A + B == x[2] && B + C == x[3]) { 13 | cout << A << " " << B << " " << C << endl; 14 | } 15 | else { 16 | cout << "No" << endl; 17 | } 18 | return 0; 19 | } -------------------------------------------------------------------------------- /sword2offer/10.rectCover.cpp: -------------------------------------------------------------------------------- 1 | //矩形覆盖 2 | //https://www.nowcoder.com/practice/72a5a919508a4251859fb2cfb987a0e6 3 | class Solution { 4 | public: 5 | int rectCover(int number) { 6 | //依旧是斐波拉契 7 | if(number <=2) return number; 8 | int pre = 2; 9 | int pre_pre = 1; 10 | for(int i = 2;i 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n; 8 | cin >> n; 9 | string s; 10 | int l = -90; 11 | int r = 90; 12 | while (l <= r) 13 | { 14 | int m = (r + l) / 2; 15 | if (m > n) { 16 | r = m; 17 | s.push_back('0'); 18 | } 19 | else { 20 | l = m; 21 | s.push_back('1'); 22 | } 23 | if (s.length() == 6) 24 | break; 25 | } 26 | cout << s << endl; 27 | return 0; 28 | } -------------------------------------------------------------------------------- /wangyi-2811407/6.maxOddDivisor.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | long long f(long long N) 6 | { 7 | if (N <= 1) return N; 8 | if (N & 1) 9 | { 10 | return N + (N - 1) * (N - 1) / 4 + f(N >> 1); 11 | } 12 | else 13 | { 14 | //偶数 15 | return (N >> 1) * (N >> 1) + f(N >> 1); 16 | } 17 | } 18 | 19 | int main() 20 | { 21 | long long n; 22 | cin >> n; 23 | cout << f(n) << endl; 24 | return 0; 25 | } -------------------------------------------------------------------------------- /nowcoder-9439037/1.encrypt.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | char buf[81]; 8 | cin.getline(buf,81); 9 | string s(buf); 10 | for (auto& it : s) { 11 | if ((it >= 'a'&& it <= 'z') || (it >= 'A' && it <= 'Z')) { 12 | if (it == 'z') it = 'a'; 13 | else if (it == 'Z') it = 'A'; 14 | else it = it + 1; 15 | } 16 | } 17 | cout << s << endl; 18 | return 0; 19 | } 20 | -------------------------------------------------------------------------------- /sword2offer/15.ReverseList.cpp: -------------------------------------------------------------------------------- 1 | //反转链表 2 | //https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca 3 | class Solution { 4 | public: 5 | ListNode* ReverseList(ListNode* pHead) { 6 | ListNode* pPrv = NULL; 7 | ListNode* pNxt = pHead; 8 | ListNode* pNode = NULL; 9 | while(pNxt){ 10 | pNode = pNxt; 11 | pNxt = pNxt->next; 12 | pNode->next = pPrv; 13 | pPrv = pNode; 14 | } 15 | return pPrv; 16 | } 17 | }; -------------------------------------------------------------------------------- /wangyi-2811407/2.elegantPoint.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int r2; 8 | cin >> r2; 9 | int cnt = 0; 10 | int r = sqrt(r2); 11 | if (r*r == r2) 12 | { 13 | cnt += 4; 14 | } 15 | for (int x = 1; x < sqrt(r2); x++) 16 | { 17 | int y = sqrt(r2 - x*x); 18 | //只要算第一象限 19 | if (x*x + y*y == r2) { 20 | cnt += 4; 21 | } 22 | } 23 | cout << cnt << endl; 24 | return 0; 25 | } -------------------------------------------------------------------------------- /iqiyi-8246915/2.cow.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | using namespace std; 7 | 8 | int main() 9 | { 10 | int n; 11 | cin >> n; 12 | vector cows(n); 13 | for (int i = 0; i < n; i++) 14 | { 15 | cin >> cows[i]; 16 | } 17 | sort(cows.begin(), cows.end()); 18 | long long result = 1; 19 | for (int i = 0; i < n; i++) 20 | { 21 | result = ((cows[i] - i) % 1000000007 * result) % 1000000007; 22 | } 23 | cout << result<< endl; 24 | return 0; 25 | } -------------------------------------------------------------------------------- /leetcode/10.hasCycle.cpp: -------------------------------------------------------------------------------- 1 | //linked-list-cycle 2 | //https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9 3 | class Solution { 4 | public: 5 | bool hasCycle(ListNode *head) { 6 | ListNode* fast = head; 7 | ListNode* slow = head; 8 | while(fast&&slow){ 9 | fast = fast->next; 10 | if(fast == NULL) break; 11 | fast = fast->next; 12 | slow = slow->next; 13 | if(fast == slow) break; 14 | } 15 | return fast?true:false; 16 | } 17 | }; -------------------------------------------------------------------------------- /tengxun-5582994/1.code.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | string s; 8 | cin >> s; 9 | int base[4]; 10 | base[3] = 1;//aaaa aaab的间距 11 | base[2] = 25 * base[3] + 1;//aaa aab的间距 12 | base[1] = 25 * base[2] + 1;//aa ab的间距 13 | base[0] = 25 * base[1] + 1;//a b的间距 14 | long long result = s.length() - 1; 15 | for (int i = 0; i < s.length(); i++) { 16 | result += base[i] * (s[i] - 'a'); 17 | } 18 | cout << result << endl; 19 | return 0; 20 | } -------------------------------------------------------------------------------- /iqiyi-8246879/1.missBrackets.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | string s; 10 | cin >> s; 11 | int depth = 0; 12 | int count = 0; 13 | int i = 0; 14 | while (i < s.length()) 15 | { 16 | if (s[i] == '(') 17 | depth++; 18 | else if (depth == 0) 19 | count++; 20 | else 21 | depth--; 22 | i++; 23 | } 24 | cout << count + depth << endl; 25 | return 0; 26 | } -------------------------------------------------------------------------------- /sword2offer/9.jumpFloorII.cpp: -------------------------------------------------------------------------------- 1 | //变态跳台阶 2 | //https://www.nowcoder.com/practice/22243d016f6b47f2a6928b4313c85387 3 | class Solution { 4 | public: 5 | //f(n) = f(n-1) + f(n-2) + ... + f(n - n + 1) + f(n - n) 6 | //f(n-1) = f(n-2)+...+ f(1) + f(0) 7 | //所以f(n) = 2*f(n-1); 8 | //f(0) = 1 9 | //f(1) = 1 10 | //f(2) = 2; 11 | int jumpFloorII(int number) { 12 | if(number <= 1) return number; 13 | int pre = 1; 14 | for(int i = 1;i array) { 6 | int maxSum = 0x80000000; 7 | int curSum = 0; 8 | for(auto& it:array){ 9 | if(curSum < 0){ 10 | curSum = it; 11 | }else{ 12 | curSum += it; 13 | } 14 | maxSum = max(maxSum,curSum); 15 | } 16 | return maxSum; 17 | } 18 | }; -------------------------------------------------------------------------------- /sword2offer/51.multiply.cpp: -------------------------------------------------------------------------------- 1 | //构建乘积数组 2 | //https://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46 3 | class Solution { 4 | public: 5 | vector multiply(const vector& A) { 6 | vector B = A; 7 | if(A.size() == 0) return B; 8 | B[0] = 1; 9 | for(int i = 1;i=0;i--){ 14 | tmp *= A[i+1]; 15 | B[i] *= tmp; 16 | } 17 | return B; 18 | } 19 | }; -------------------------------------------------------------------------------- /sword2offer/32.PrintMinNumber.cpp: -------------------------------------------------------------------------------- 1 | //把数组排成最小的数 2 | //https://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993 3 | class Solution { 4 | public: 5 | static bool cmp(int i1,int i2){ 6 | stringstream ss1,ss2; 7 | ss1<0; 10 | } 11 | string PrintMinNumber(vector numbers) { 12 | sort(numbers.begin(),numbers.end(),cmp); 13 | stringstream ss; 14 | for(auto& it:numbers) 15 | ss< 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | string s; 8 | stringstream ss; 9 | cin >> s; 10 | char ch = s[0]; 11 | int count = 1; 12 | for (int i = 1; i < s.length(); i++) 13 | { 14 | if (s[i] == ch) { 15 | count++; 16 | } 17 | else { 18 | ss << count << ch; 19 | count = 1; 20 | ch = s[i]; 21 | } 22 | } 23 | ss << count << ch; 24 | cout << ss.str() << endl; 25 | return 0; 26 | } -------------------------------------------------------------------------------- /wangyi-6910869/1.magicCoin.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | using namespace std; 5 | 6 | void getPath(string& s,int n) { 7 | if (n == 0) return; 8 | if ((n - 1) & 1) 9 | { 10 | n = (n - 2) / 2; 11 | getPath(s, n); 12 | s.push_back('2'); 13 | } 14 | else { 15 | n = (n - 1) / 2; 16 | getPath(s, n); 17 | s.push_back('1'); 18 | } 19 | } 20 | 21 | int main() 22 | { 23 | int n; 24 | cin >> n; 25 | string s; 26 | getPath(s, n); 27 | cout << s << endl; 28 | return 0; 29 | } -------------------------------------------------------------------------------- /nowcoder-9439037/5.goodArray.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n; 8 | cin >> n; 9 | int result = 0; 10 | int i = 0; 11 | while(i < n) 12 | { 13 | int num; 14 | cin >> num; 15 | //如果当前数等于i 则次数+1 16 | //如果下面一个数等于i+1 则次数也是+1 17 | if (num == i+1) { 18 | if (i < n) { 19 | i++; 20 | cin >> num; 21 | } 22 | result++; 23 | } 24 | i++; 25 | } 26 | cout << result << endl; 27 | return 0; 28 | } 29 | -------------------------------------------------------------------------------- /wangyi-9763997/4.gotoClass.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | //东南西北 8 | static char str[] = "ESWN"; 9 | static int map[][2] = { 10 | {3,1}, 11 | {0,2}, 12 | { 1,3 }, 13 | { 2,0 } 14 | }; 15 | int cur = 3; 16 | int n; 17 | cin >> n; 18 | for (int i = 0; i < n; i++) 19 | { 20 | char c; 21 | cin >> c; 22 | int lr = 0; 23 | if (c == 'R') 24 | lr = 1; 25 | cur = map[cur][lr]; 26 | } 27 | cout << str[cur] << endl; 28 | return 0; 29 | } -------------------------------------------------------------------------------- /sword2offer/3.printListFromTailToHead.cpp: -------------------------------------------------------------------------------- 1 | //从尾到头打印链表 2 | //https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035 3 | class Solution { 4 | public: 5 | vector printListFromTailToHead(ListNode* head) { 6 | vector result; 7 | if(head == NULL) return result; 8 | _printListFromTailToHead(head,result); 9 | return result; 10 | } 11 | 12 | void _printListFromTailToHead(ListNode* node,vector& result){ 13 | if(node->next){ 14 | _printListFromTailToHead(node->next,result); 15 | } 16 | result.push_back(node->val); 17 | } 18 | }; 19 | -------------------------------------------------------------------------------- /sword2offer/49.StrToInt.cpp: -------------------------------------------------------------------------------- 1 | //把字符串转换成整数 2 | //https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e 3 | class Solution { 4 | public: 5 | int StrToInt(string str) { 6 | if(str.length() == 0) return 0; 7 | int neg = 1; 8 | char* p = &str[0]; 9 | if(*p == '-'){ 10 | neg = -1; 11 | p++; 12 | }else if(*p == '+') p++; 13 | int result = 0; 14 | while(*p){ 15 | if(*p < '0' || *p > '9') return 0; 16 | result = result * 10 + (*p-'0'); 17 | p++; 18 | } 19 | return neg*result; 20 | } 21 | }; -------------------------------------------------------------------------------- /tengxun-1725829/2.charShift.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | using namespace std; 5 | inline void swap(char& a, char& b) { 6 | a = a^b; 7 | b = a^b; 8 | a = a^b; 9 | } 10 | 11 | inline bool isUpper(char& a) { 12 | return a >= 'A' && a <= 'Z'; 13 | } 14 | 15 | int main() 16 | { 17 | string s; 18 | while (cin >> s) { 19 | char* p = &s[0]; 20 | while (*p) { 21 | while (*p && isUpper(*p)) { 22 | p++; 23 | } 24 | while (*p && p > &s[0] && isUpper(*(p - 1))) { 25 | swap(*p, *(p - 1)); 26 | p--; 27 | } 28 | p++; 29 | } 30 | cout << s << endl; 31 | } 32 | return 0; 33 | } -------------------------------------------------------------------------------- /tengxun-5582994/2.gameTask.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | using namespace std; 5 | inline void swap(char& a, char& b) { 6 | a = a^b; 7 | b = a^b; 8 | a = a^b; 9 | } 10 | 11 | inline bool isUpper(char& a) { 12 | return a >= 'A' && a <= 'Z'; 13 | } 14 | 15 | int main() 16 | { 17 | string s; 18 | while (cin >> s) { 19 | char* p = &s[0]; 20 | while (*p) { 21 | while (*p && isUpper(*p)) { 22 | p++; 23 | } 24 | while (*p && p > &s[0] && isUpper(*(p - 1))) { 25 | swap(*p, *(p - 1)); 26 | p--; 27 | } 28 | p++; 29 | } 30 | cout << s << endl; 31 | } 32 | return 0; 33 | } -------------------------------------------------------------------------------- /wangyi-2811407/7.buyApple.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n; 8 | cin >> n; 9 | vector dp(101,0x3d3d3d3d); 10 | dp[6] = 1; 11 | dp[8] = 1; 12 | for (int i = 0; i < n; i++) 13 | { 14 | if (dp[i] == 0x3d3d3d3d) 15 | continue; 16 | //当前点可以到哪些点 17 | for (int j = 6; j + i <= n; j += 6) 18 | { 19 | dp[j + i] = min(dp[i + j], dp[i] + j / 6); 20 | } 21 | for (int j = 8; j + i <= n; j += 8) 22 | { 23 | dp[j + i] = min(dp[i + j], dp[i] + j / 8); 24 | } 25 | } 26 | cout << (dp[n] == 0x3d3d3d3d ? -1 : dp[n]) << endl; 27 | return 0; 28 | } -------------------------------------------------------------------------------- /sword2offer/54.FirstAppearingOnce.cpp: -------------------------------------------------------------------------------- 1 | //字符流中第一个不重复的字符 2 | //https://www.nowcoder.com/practice/00de97733b8e4f97a3fb5c680ee10720 3 | class Solution 4 | { 5 | public: 6 | queue q; 7 | map m; 8 | //Insert one char from stringstream 9 | void Insert(char ch) 10 | { 11 | if(++m[ch] == 1){ 12 | q.push(ch); 13 | } 14 | } 15 | //return the first appearence once char in current stringstream 16 | char FirstAppearingOnce() 17 | { 18 | while(!q.empty() && m[q.front()] > 1) 19 | q.pop(); 20 | return q.empty()?'#':q.front(); 21 | } 22 | 23 | }; -------------------------------------------------------------------------------- /sword2offer/43.LeftRotateString.cpp: -------------------------------------------------------------------------------- 1 | //左旋转字符串 2 | //https://www.nowcoder.com/practice/12d959b108cb42b1ab72cef4d36af5ec 3 | class Solution { 4 | public: 5 | void reverseString(char* beg,char* end){ 6 | while(beg < end){ 7 | swap(*beg,*end); 8 | beg++; 9 | end--; 10 | } 11 | } 12 | 13 | string LeftRotateString(string str, int n) { 14 | if(str.length() <= 1) return str; 15 | reverseString(&str[0],&str[n-1]); 16 | reverseString(&str[n],&str[str.length()-1]); 17 | reverseString(&str[0],&str[str.length()-1]); 18 | return str; 19 | } 20 | }; -------------------------------------------------------------------------------- /wangyi-4575457/8.strangeFormula.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | string s; 8 | cin >> s; 9 | int result = s[0]-'0'; 10 | for (int i = 1; i < s.length(); i++) 11 | { 12 | if (s[i] == '+') 13 | { 14 | result += s[i + 1] - '0'; 15 | i++; 16 | } 17 | else if (s[i] == '-') { 18 | result -= s[i + 1] - '0'; 19 | i++; 20 | } 21 | else { 22 | result *= s[i + 1] - '0'; 23 | i++; 24 | } 25 | } 26 | cout << result << endl; 27 | return 0; 28 | } -------------------------------------------------------------------------------- /wangyi-9763997/7.alarm.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | 4 | int main() { 5 | int N; 6 | cin >> N; 7 | vector alarm; 8 | while (N--) 9 | { 10 | int Hi, Mi; 11 | cin >> Hi >> Mi; 12 | alarm.push_back(Hi * 60 + Mi); 13 | } 14 | int X; 15 | cin >> X; 16 | int hi,mi, ClassTime; 17 | cin >> hi>>mi; 18 | ClassTime = hi * 60 + mi - X; 19 | sort(alarm.begin(), alarm.end(), greater()); 20 | auto it = lower_bound(alarm.begin(), alarm.end(), ClassTime, greater()); 21 | cout << *it / 60 << " " << *it % 60 << endl; 22 | return 0; 23 | } -------------------------------------------------------------------------------- /sword2offer/1.Find.cpp: -------------------------------------------------------------------------------- 1 | //二维数组中的查找 2 | //https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e 3 | class Solution { 4 | public: 5 | bool Find(int target, vector > array) { 6 | if(array.size() == 0 || array[0].size() == 0) return false; 7 | int i = 0; 8 | int j = array.size() - 1; 9 | while(i < array.size() && j >= 0){ 10 | if(array[i][j] > target){ 11 | j--; 12 | }else if(array[i][j] < target){ 13 | i++; 14 | }else{ 15 | return true; 16 | } 17 | } 18 | return false; 19 | } 20 | }; -------------------------------------------------------------------------------- /wangyi-4575457/10.rememberWord.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n,m; 8 | cin >> n >> m; 9 | set remember; 10 | map system; 11 | for (int i = 0; i < n; i++) { 12 | string s; 13 | cin >> s; 14 | remember.insert(s); 15 | } 16 | for (int i = 0; i < m; i++) { 17 | string s; 18 | cin >> s; 19 | system[s] = s.length() * s.length(); 20 | } 21 | int result = 0; 22 | for (auto& it : remember) { 23 | result += system[it]; 24 | } 25 | cout << result << endl; 26 | return 0; 27 | } -------------------------------------------------------------------------------- /sword2offer/22.PrintFromTopToBottom.cpp: -------------------------------------------------------------------------------- 1 | //从上往下打印二叉树 2 | //https://www.nowcoder.com/practice/7fe2212963db4790b57431d9ed259701 3 | class Solution { 4 | public: 5 | vector PrintFromTopToBottom(TreeNode* root) { 6 | vector result; 7 | if(root == NULL) return result; 8 | queue q; 9 | q.push(root); 10 | while(!q.empty()){ 11 | TreeNode* node = q.front(); 12 | q.pop(); 13 | result.push_back(node->val); 14 | if(node->left) q.push(node->left); 15 | if(node->right) q.push(node->right); 16 | } 17 | return result; 18 | } 19 | }; -------------------------------------------------------------------------------- /sword2offer/58.isSymmetrical.cpp: -------------------------------------------------------------------------------- 1 | //对称的二叉树 2 | //https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb 3 | class Solution { 4 | public: 5 | bool isSymmetrical(TreeNode* pRoot) 6 | { 7 | if(pRoot == NULL) return true; 8 | return isSymmetrical(pRoot->left,pRoot->right); 9 | } 10 | bool isSymmetrical(TreeNode* pLeft,TreeNode* pRight) 11 | { 12 | if(pLeft == NULL) return pRight == NULL; 13 | if(pRight == NULL) return false; 14 | if(pLeft->val != pRight->val) return false; 15 | return isSymmetrical(pLeft->left,pRight->right)&& 16 | isSymmetrical(pLeft->right,pRight->left); 17 | } 18 | }; -------------------------------------------------------------------------------- /toutiao-8537039/3.room.cpp: -------------------------------------------------------------------------------- 1 | //附加题 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | int n; 10 | cin >> n; 11 | vector pi(n, 0); 12 | for (int i = 0; i < n; i++) 13 | { 14 | cin >> pi[i]; 15 | pi[i] --; 16 | } 17 | vector dp(n + 1, 0); 18 | //开始时在第一个房间 19 | dp[0] = 0; 20 | //第二个房间等于第一个房间走一步到pi,再从pi走到第一个房间,然后再走一步。 21 | for (size_t i = 0; i < n; i++) 22 | { 23 | dp[i + 1] = dp[i] + 1 + dp[i] - dp[pi[i]] + 1; 24 | dp[i + 1] = (dp[i + 1] + 1000000007) % 1000000007; 25 | } 26 | cout << dp[n] << endl; 27 | return 0; 28 | } -------------------------------------------------------------------------------- /wangyi-6910869/3.stringFragment.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | string s; 10 | cin >> s; 11 | int kind = 0; 12 | int sumlen = 0; 13 | int len = 0; 14 | char ch = s.front(); 15 | for (auto& it : s) { 16 | if (ch == it) { 17 | len ++; 18 | } 19 | else { 20 | ch = it; 21 | sumlen += len; 22 | len = 1; 23 | kind ++; 24 | } 25 | } 26 | sumlen += len; 27 | kind++; 28 | printf("%.2lf", round(sumlen / (double)kind * 100) / 100.0); 29 | return 0; 30 | } -------------------------------------------------------------------------------- /leetcode/14.singleNumber2.cpp: -------------------------------------------------------------------------------- 1 | //single-number-ii 2 | //https://www.nowcoder.com/practice/1097ca585245418ea2efd0e8b4d9eb7a 3 | class Solution { 4 | public: 5 | //32大小的数组分别统计A中元素每一位中1的个数。出现3次的结果为3的倍数 6 | int singleNumber(int A[], int n) { 7 | int bit[32] = {0}; 8 | for(int i = 0;i 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int T; 8 | cin >> T; 9 | while (T--) 10 | { 11 | int n; 12 | cin >> n; 13 | vector input(n); 14 | map indexMap; 15 | queue q; 16 | for (int i = 0; i < n; i++) 17 | { 18 | input[i] = i; 19 | q.push(i); 20 | } 21 | int c = 0; 22 | //获取映射序列 23 | while (!q.empty()) 24 | { 25 | q.push(q.front()); 26 | q.pop(); 27 | indexMap[q.front()] = ++c; 28 | q.pop(); 29 | } 30 | for(auto& it:indexMap) 31 | { 32 | cout << it.second << (it.first == n - 1 ? "\n" : " "); 33 | } 34 | } 35 | return 0; 36 | } -------------------------------------------------------------------------------- /wangyi-9763997/3.streetLight.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | 4 | int main() { 5 | int n; 6 | cin >> n; 7 | while (n--) { 8 | int l; 9 | cin >> l; 10 | int count = 0; 11 | while (l > 0) 12 | { 13 | char c; 14 | cin >> c; 15 | l--; 16 | if (c == '.') { 17 | //每一个灯 照亮三个点 18 | count++; 19 | if(l-- > 0) 20 | cin >> c; 21 | if (l-- > 0) 22 | cin >> c; 23 | } 24 | } 25 | cout << count << endl; 26 | } 27 | return 0; 28 | } -------------------------------------------------------------------------------- /sword2offer/20.minStack.cpp: -------------------------------------------------------------------------------- 1 | //包含min函数的栈 2 | //https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49 3 | class Solution { 4 | public: 5 | void push(int value) { 6 | stack_data.push(value); 7 | if(stack_min.empty()){ 8 | stack_min.push(value); 9 | }else{ 10 | stack_min.push(min(value,stack_min.top())); 11 | } 12 | } 13 | void pop() { 14 | stack_data.pop() 15 | stack_min.pop() 16 | } 17 | int top() { 18 | return stack_data.top(); 19 | } 20 | int min() { 21 | return stack_min.top(); 22 | } 23 | 24 | stack stack_data; 25 | stack stack_min 26 | }; -------------------------------------------------------------------------------- /sword2offer/14.FindKthToTail.cpp: -------------------------------------------------------------------------------- 1 | //链表中倒数第k个结点 2 | //https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a 3 | class Solution { 4 | public: 5 | ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { 6 | ListNode* first = pListHead; 7 | ListNode* second = pListHead; 8 | int n = 0; 9 | //first走k-1步,second开始走,当first走到最后时,second正好是倒数第k个节点 10 | while(first && n < k){ 11 | first = first->next; 12 | n++; 13 | } 14 | if(n != k) return NULL; 15 | while(first){ 16 | first = first->next; 17 | second = second->next; 18 | } 19 | return second; 20 | } 21 | }; -------------------------------------------------------------------------------- /wangyi-4575457/4.clearRepeat.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | 6 | int main() 7 | { 8 | int n; 9 | cin >> n; 10 | vector data(n); 11 | vector dataIndex(1001, 100); 12 | for (int i = 0; i < n; i++) 13 | { 14 | cin >> data[i]; 15 | dataIndex[data[i]] = i; 16 | } 17 | sort(dataIndex.begin(), dataIndex.end()); 18 | auto it = dataIndex.begin(); 19 | while(it != dataIndex.end()) 20 | { 21 | if (*it == 100) break; 22 | if(it != dataIndex.begin()) 23 | cout << " "; 24 | cout << data[*it]; 25 | it++; 26 | } 27 | cout << endl; 28 | return 0; 29 | } -------------------------------------------------------------------------------- /sword2offer/55.EntryNodeOfLoop.cpp: -------------------------------------------------------------------------------- 1 | //链表中环的入口结点 2 | //https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4 3 | class Solution { 4 | public: 5 | ListNode* EntryNodeOfLoop(ListNode* pHead) 6 | { 7 | if(pHead == NULL) return NULL; 8 | ListNode* fast = pHead; 9 | ListNode* slow = pHead; 10 | do{ 11 | if(fast == NULL || fast->next == NULL) return NULL; 12 | fast = fast->next->next; 13 | slow = slow->next; 14 | }while(fast != slow); 15 | slow = pHead; 16 | while(slow != fast){ 17 | slow = slow->next; 18 | fast = fast->next; 19 | } 20 | return slow; 21 | } 22 | }; -------------------------------------------------------------------------------- /leetcode/7.preorderTraversal.cpp: -------------------------------------------------------------------------------- 1 | //binary-tree-preorder-traversal 2 | //https://www.nowcoder.com/practice/501fb3ca49bb4474bf5fa87274e884b4 3 | class Solution { 4 | public: 5 | vector preorderTraversal(TreeNode *root) { 6 | TreeNode* p = root; 7 | stack s; 8 | vector result; 9 | while(p || !s.empty()){ 10 | while(p){ 11 | result.push_back(p->val); 12 | s.push(p); 13 | p = p->left; 14 | } 15 | if(!s.empty()){ 16 | p = s.top(); 17 | s.pop(); 18 | p = p->right; 19 | } 20 | } 21 | return result; 22 | } 23 | }; -------------------------------------------------------------------------------- /nowcoder-9439037/3.taxi.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | int n, s; 5 | vector p; 6 | 7 | int result; 8 | 9 | void dfs(int cur,int minv,int sum,int count) 10 | { 11 | if (sum >= s && sum - minv < s) { 12 | result = max(result, count); 13 | } 14 | if (sum > s || cur == n) 15 | return; 16 | dfs(cur + 1, min(minv, p[cur]), sum + p[cur], count + 1); 17 | dfs(cur + 1, minv, sum, count); 18 | } 19 | int main() 20 | { 21 | cin >> n >> s; 22 | p.resize(n); 23 | for (int i = 0; i < n; i++) 24 | { 25 | cin >> p[i]; 26 | } 27 | result = -1; 28 | dfs(0, 0x3d3d3d3d, 0, 0); 29 | cout << result << endl; 30 | return 0; 31 | } -------------------------------------------------------------------------------- /sword2offer/62.KthNode.cpp: -------------------------------------------------------------------------------- 1 | //二叉搜索树的第k个结点 2 | //https://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a 3 | class Solution { 4 | public: 5 | TreeNode* KthNode(TreeNode* pRoot, int k) 6 | { 7 | int depth = 0; 8 | return KthNode(pRoot,depth,k); 9 | } 10 | 11 | TreeNode* KthNode(TreeNode* pRoot,int& depth, int k) 12 | { 13 | if(pRoot == NULL) return NULL; 14 | TreeNode* ret = NULL; 15 | if(pRoot->left) 16 | ret = KthNode(pRoot->left,depth,k); 17 | if(ret) return ret; 18 | if(++depth == k) return pRoot; 19 | if(pRoot->right) 20 | ret = KthNode(pRoot->right,depth,k); 21 | return ret; 22 | } 23 | }; -------------------------------------------------------------------------------- /leetcode/12.wordBreak.cpp: -------------------------------------------------------------------------------- 1 | //word-break 2 | //https://www.nowcoder.com/practice/5f3b7bf611764c8ba7868f3ed40d6b2c 3 | class Solution { 4 | public: 5 | bool wordBreak(string s, unordered_set &dict) { 6 | //dp[i] 表示0-i是否可被单词组合成功 7 | int len = s.length(); 8 | vector dp(len + 1, false); 9 | dp[0] = true; 10 | for (int i = 0; i 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n; 8 | //dp[i] 表示暗黑字符串数目 9 | //S[i] 表示i长度的字符串最后两位是相同字母的数目 10 | //D[i] 表示i长度的字符串最后两位是不同字幕的数目 11 | //最后两位相同,无论新字母是什么 都是暗黑 一共三种情况,此外,如果新字母和最后一个字母相同,则新的字符串最后两位仍然是相同的,有1种情况 12 | //最后两位不同,新字母如果和前两位不同,则不是暗黑,所以有两种情况是暗黑的。此外,如果新字母和最后一个字母相同,则新字符串是S的情况,有1中情况 13 | //S[i] = S[i-1]+D[i-1]=dp[i-1] 14 | //dp[i] = 3*S[i-1] + 2*D[i-1] =dp[i-1]*2+S[i-1]=dp[i-1]*2+dp[i-2] 15 | while (cin >> n) { 16 | vector dp(n + 1, 0); 17 | dp[1] = 3; 18 | dp[2] = 9; 19 | for (int i = 3; i <= n; i++) 20 | { 21 | dp[i] = dp[i - 1] * 2 + dp[i - 2]; 22 | } 23 | cout << dp[n] << endl; 24 | } 25 | return 0; 26 | } -------------------------------------------------------------------------------- /meituan-5583018/2.countWays.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | int N; 10 | cin >> N; 11 | int money[] = { 1,5,10,20,50,100 }; 12 | vector> dp(N + 1, vector(6, 0)); 13 | dp[0][0] = 1; 14 | for (int i = 1; i<6; i++) { 15 | dp[0][i] = 1; 16 | } 17 | for (int i = 1; i= money[j]) ? (dp[i - money[j]][j]) : 0); 23 | } 24 | } 25 | cout << dp[N][5] << endl; 26 | return 0; 27 | } 28 | 添加笔记 29 | -------------------------------------------------------------------------------- /sword2offer/40.FindNumsAppearOnce.cpp: -------------------------------------------------------------------------------- 1 | //数组中只出现一次的数字 2 | //https://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811 3 | class Solution { 4 | public: 5 | void FindNumsAppearOnce(vector data,int* num1,int *num2) { 6 | int num = 0; 7 | for(auto& it:data){ 8 | num ^= it; 9 | } 10 | int i; 11 | for(i = 0;i<32;i++){ 12 | if( (num >> i) & 1){ 13 | break; 14 | } 15 | } 16 | *num1 = 0; 17 | for(auto& it:data){ 18 | if((it>>i)&1){ 19 | *num1 ^= it; 20 | } 21 | } 22 | *num2 = num ^ *num1; 23 | if(*num1 > *num2) 24 | swap(*num1,*num2); 25 | } 26 | }; -------------------------------------------------------------------------------- /sword2offer/5.twoStack.cpp: -------------------------------------------------------------------------------- 1 | //用两个栈实现队列 2 | //https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6 3 | class Solution 4 | { 5 | public: 6 | int error_; 7 | void push(int node) { 8 | stack1.push(node); 9 | } 10 | 11 | int pop() { 12 | if(stack2.empty()){ 13 | while(!stack1.empty()){ 14 | stack2.push(stack1.top()); 15 | stack1.pop(); 16 | } 17 | } 18 | error_ = 0; 19 | if(stack2.empty()){ 20 | error_ = 1; 21 | return 0; 22 | } 23 | int node = stack2.top(); 24 | stack2.pop(); 25 | return node; 26 | } 27 | private: 28 | stack stack1; 29 | stack stack2; 30 | }; -------------------------------------------------------------------------------- /tengxun-5582994/3.primePair.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | bool IsPrime(int num) 6 | { 7 | for (int i = 2; i*i <= num; i++) 8 | { 9 | if (num % i == 0) 10 | return false; 11 | } 12 | return true; 13 | } 14 | int main() 15 | { 16 | int n; 17 | cin >> n; 18 | int l = 2; 19 | int r = n; 20 | int result = 0; 21 | while (l <= r) { 22 | if (!IsPrime(l)) { 23 | l++; 24 | continue; 25 | } 26 | if (!IsPrime(r)) 27 | { 28 | r--; 29 | continue; 30 | } 31 | if (l + r == n) { 32 | result++; 33 | l++; 34 | r--; 35 | } 36 | else if (l + r > n) { 37 | r--; 38 | } 39 | else if (l + r < n) { 40 | l++; 41 | } 42 | } 43 | cout << result << endl; 44 | return 0; 45 | } -------------------------------------------------------------------------------- /leetcode/18.cloneGraph.cpp: -------------------------------------------------------------------------------- 1 | //clone-graph 2 | //https://www.nowcoder.com/practice/5ec76def9d7b420794091727a97f0dc6 3 | class Solution { 4 | public: 5 | map status; 6 | UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { 7 | if(node == NULL) return NULL; 8 | UndirectedGraphNode* pNewHead = new UndirectedGraphNode(node->label); 9 | status[node->label] = pNewHead; 10 | for(auto& it:node->neighbors){ 11 | if(status.count(it->label)){ 12 | pNewHead->neighbors.push_back(status[it->label]); 13 | continue; 14 | } 15 | pNewHead->neighbors.push_back(cloneGraph(it)); 16 | } 17 | return pNewHead; 18 | } 19 | }; -------------------------------------------------------------------------------- /sword2offer/13.reOrderArray.cpp: -------------------------------------------------------------------------------- 1 | //调整数组顺序使奇数位于偶数前面 2 | //https://www.nowcoder.com/practice/beb5aa231adc45b2a5dcc5b62c93f593 3 | class Solution { 4 | public: 5 | void reOrderArray(vector &array) { 6 | int i = 0; 7 | int j; 8 | while(i < array.size()){ 9 | while(i < array.size() && array[i] & 1){ 10 | i++; 11 | } 12 | if(i == array.size()) break; 13 | j = i+1; 14 | while(j < array.size() && !(array[j] & 1)){ 15 | j++; 16 | } 17 | if(j == array.size()) break; 18 | while(i < j){ 19 | swap(array[j],array[j-1]); 20 | j --; 21 | } 22 | } 23 | } 24 | }; -------------------------------------------------------------------------------- /wangyi-2811407/3.jumpStone.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n, m; 8 | cin >> n >> m; 9 | vector dp(m + 1, 0x7dddddd); 10 | dp[n] = 0; 11 | for (int i = n; i < m; i++) 12 | { 13 | if (dp[i] == 0x7dddddd) continue; 14 | for (int j = 2; j * j <= i; j++) 15 | { 16 | if (i % j == 0) 17 | { 18 | if (i + j <= m) 19 | dp[i + j] = min(dp[i + j], dp[i] + 1); 20 | if (i + i / j <= m) 21 | dp[i + i / j] = min(dp[i + i / j], dp[i] + 1); 22 | } 23 | } 24 | } 25 | cout << ((dp[m] == 0x7dddddd) ? -1 : dp[m]) << endl; 26 | return 0; 27 | } -------------------------------------------------------------------------------- /leetcode/17.canCompleteCircuit.cpp: -------------------------------------------------------------------------------- 1 | //gas-station 2 | //https://www.nowcoder.com/practice/3b1abd8ba2e54452b6e18b31780b3635 3 | class Solution { 4 | public: 5 | int canCompleteCircuit(vector &gas, vector &cost) { 6 | int n = gas.size(); 7 | int s = n-1; 8 | int remain = gas[s]-cost[s]; 9 | int e = 0; 10 | //从最后面走到最前面 11 | while( s > e){ 12 | if(remain < 0){ 13 | //当前油小于0,起点退一步 14 | s--; 15 | remain = remain + gas[s]-cost[s]; 16 | }else{ 17 | //大于0 走下一步 18 | remain = remain + gas[e]-cost[e]; 19 | e++; 20 | } 21 | } 22 | return remain >= 0? s : -1; 23 | } 24 | }; -------------------------------------------------------------------------------- /sword2offer/45.IsContinuous.cpp: -------------------------------------------------------------------------------- 1 | //扑克牌顺子 2 | //https://www.nowcoder.com/practice/ 3 | class Solution { 4 | public: 5 | bool IsContinuous( vector numbers ) { 6 | if(numbers.size() != 5) return false; 7 | sort(numbers.begin(),numbers.end()); 8 | int godCount = 0; 9 | for(auto& it:numbers){ 10 | if(it == 0) godCount++; 11 | else break; 12 | } 13 | bool ret = true; 14 | for(int i = godCount;i<4;i++){ 15 | if(numbers[i+1] == numbers[i] || numbers[i+1] - numbers[i] -1 > godCount){ 16 | ret = false; 17 | break; 18 | } 19 | godCount -= numbers[i+1]-numbers[i]-1; 20 | } 21 | return ret; 22 | } 23 | }; -------------------------------------------------------------------------------- /wangyi-2385858/1.shuffle.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int T; 8 | cin >> T; 9 | while (T--) 10 | { 11 | int n, k; 12 | cin >> n >> k; 13 | vector data(2*n); 14 | for (int i = 0; i < n; i++) 15 | { 16 | cin >> data[i * 2] >> data[i * 2 + 1]; 17 | } 18 | for (int i = 0; i < k; i++) 19 | { 20 | vector d1(data.begin(), data.begin() + n); 21 | vector d2(data.begin() + n, data.begin() + 2*n); 22 | int c = 0; 23 | for (int j = 0; j < n; j++) 24 | { 25 | data[c++] = d1[j]; 26 | data[c++] = d2[j]; 27 | } 28 | } 29 | for (int i = 0; i < 2*n; i++) 30 | { 31 | cout << data[i] << (i == 2 * n - 1 ? "\n" : " "); 32 | } 33 | } 34 | return 0; 35 | } -------------------------------------------------------------------------------- /sword2offer/39.IsBalanced_Solution.cpp: -------------------------------------------------------------------------------- 1 | //平衡二叉树 2 | //https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222 3 | class Solution { 4 | public: 5 | bool IsBalanced_Solution(TreeNode* pRoot) { 6 | int depth; 7 | return IsBalanced_Solution(pRoot,depth); 8 | } 9 | 10 | bool IsBalanced_Solution(TreeNode* pRoot,int& depth){ 11 | if(pRoot == NULL){ 12 | depth = 0; 13 | return true; 14 | } 15 | int left,right; 16 | bool ret = IsBalanced_Solution(pRoot->left,left); 17 | if(!ret) return false; 18 | ret = IsBalanced_Solution(pRoot->right,right); 19 | if(!ret) return false; 20 | depth = max(left,right)+1; 21 | return abs(left-right) <= 1; 22 | } 23 | }; -------------------------------------------------------------------------------- /sword2offer/42.FindNumbersWithSum.cpp: -------------------------------------------------------------------------------- 1 | //和为S的两个数字 2 | //https://www.nowcoder.com/practice/390da4f7a00f44bea7c2f3d19491311b 3 | class Solution { 4 | public: 5 | vector FindNumbersWithSum(vector array,int sum) { 6 | vector result; 7 | if(array.size() == 0) return result; 8 | int l = 0; 9 | int r = array.size() - 1; 10 | while(l < r){ 11 | int tmpSum = array[l]+array[r]; 12 | if(tmpSum == sum){ 13 | result.push_back(array[l]); 14 | result.push_back(array[r]); 15 | break; 16 | } 17 | if(tmpSum > sum) 18 | r--; 19 | else 20 | l++; 21 | } 22 | return result; 23 | } 24 | }; -------------------------------------------------------------------------------- /leetcode/9.detectCycle.cpp: -------------------------------------------------------------------------------- 1 | //linked-list-cycle-ii 2 | //https://www.nowcoder.com/practice/6e630519bf86480296d0f1c868d425ad 3 | class Solution { 4 | public: 5 | ListNode *detectCycle(ListNode *head) { 6 | ListNode* fast = head; 7 | ListNode* slow = head; 8 | while(fast && slow){ 9 | fast = fast->next; 10 | if(fast == NULL) break; 11 | fast = fast->next; 12 | slow = slow->next; 13 | if(fast == slow) break; 14 | } 15 | //无环 16 | if(fast== NULL) return NULL; 17 | //有环 慢节点从头开始,再次相遇即为有环点 18 | slow = head; 19 | while(slow != fast){ 20 | slow = slow->next; 21 | fast = fast->next; 22 | } 23 | return fast; 24 | } 25 | }; -------------------------------------------------------------------------------- /wangyi-9763997/8.bag.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | 4 | long long n, w; 5 | vector good; 6 | long long result = 0; 7 | 8 | void dfs(int cur, long long sum) 9 | { 10 | if (sum <= w && cur == n) 11 | result++; 12 | if (cur == n || sum > w) 13 | return; 14 | dfs(cur + 1, sum + good[cur]); 15 | dfs(cur + 1, sum); 16 | } 17 | int main() { 18 | cin >> n >> w; 19 | good.resize(n); 20 | long long sum = 0; 21 | for (int i = 0; i < n; i++) { 22 | cin >> good[i]; 23 | sum += good[i]; 24 | } 25 | if (sum <= w) { 26 | //全部都可以放入 27 | result = pow(2, n); 28 | } 29 | else { 30 | dfs(0, 0); 31 | } 32 | cout << result << endl; 33 | return 0; 34 | } -------------------------------------------------------------------------------- /wangyi-4575457/2.gotoCompany.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n; 8 | cin >> n; 9 | vector taixx(n); 10 | vector taixy(n); 11 | int gx, gy; 12 | int wt, tt; 13 | for (int i = 0; i < n; i++) 14 | cin >> taixx[i]; 15 | for (int i = 0; i < n; i++) 16 | cin >> taixy[i]; 17 | cin >> gx >> gy; 18 | cin >> wt >> tt; 19 | //走路需要的时间 20 | int result = abs(gx*wt) + abs(gy*wt); 21 | //走到打车点再打车的时间 22 | for (int i = 0; i < n; i++) 23 | { 24 | int walktime = abs(taixx[i] * wt) + abs(taixy[i] * wt); 25 | result = min(walktime + (abs(gx - taixx[i]) + abs(gy - taixy[i]))*tt, result); 26 | } 27 | cout << result << endl; 28 | return 0; 29 | } -------------------------------------------------------------------------------- /wangyi-6910869/5.resortArray.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | using namespace std; 8 | 9 | 10 | int main() 11 | { 12 | int t; 13 | cin >> t; 14 | while (t--) 15 | { 16 | int n; 17 | cin >> n; 18 | int t4 = 0, t0 = 0; 19 | int tmp; 20 | while (n-- ) 21 | { 22 | cin >> tmp; 23 | if (tmp % 4 == 0) 24 | { 25 | t4++; 26 | } 27 | else if (tmp % 2 != 0) { 28 | t0++; 29 | } 30 | } 31 | if (t0 <= t4) 32 | cout << "Yes" << endl; 33 | else 34 | cout << "No" << endl; 35 | } 36 | return 0; 37 | } -------------------------------------------------------------------------------- /sword2offer/46.LastRemaining_Solution.cpp: -------------------------------------------------------------------------------- 1 | //孩子们的游戏(圆圈中最后剩下的数) 2 | //https://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6 3 | class Solution { 4 | public: 5 | int LastRemaining_Solution(int n, int m) 6 | { 7 | if(n == 0 || m == 0) return -1; 8 | list l; 9 | for(int i = 0;i 1){ 14 | for(int i = 0;i 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | stack s; 10 | int n; 11 | cin >>n; 12 | int res = 0; 13 | while(n--){ 14 | int x; 15 | cin >>x; 16 | while(!s.empty() && s.top() <= x){ 17 | res = max(s.top()^x,res); 18 | //有x的情况下,x前面比x小的数不可能再得到新的结果 19 | //因为如果新数y是最大值,那么结果就是y^x 20 | //如果y不是最大值,那么结果就是x^y或者x^(x以前的数) 21 | //x^(x以前的数)在之前已经计算过,所以这里可以将小于x的数pop 22 | s.pop(); 23 | } 24 | //s.top和x构成最大值, 25 | //s.top和s中的其他数之前已经计算过 26 | if(!s.empty()) res = max(s.top()^x,res); 27 | s.push(x); 28 | } 29 | cout<next == NULL) return head; 8 | //新增加一个链表头 9 | ListNode newHead(-1); 10 | newHead.next = insertionSortList(head->next); 11 | ListNode* pNewHead = &newHead; 12 | ListNode* pNewNode = pNewHead; 13 | //找到合适的插入点 14 | while(pNewNode && pNewNode->next && pNewNode->next->val < head->val){ 15 | pNewNode = pNewNode->next; 16 | } 17 | head->next = pNewNode->next; 18 | pNewNode->next = head; 19 | return pNewHead->next; 20 | } 21 | }; -------------------------------------------------------------------------------- /sword2offer/21.IsPopOrder.cpp: -------------------------------------------------------------------------------- 1 | //栈的压入、弹出序列 2 | //https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106 3 | class Solution { 4 | public: 5 | bool IsPopOrder(vector pushV,vector popV) { 6 | stack s; 7 | int pushIndex = 0; 8 | int popIndex = 0; 9 | while(pushIndex < pushV.size()){ 10 | if(s.empty() || s.top() != popV[popIndex]){ 11 | s.push(pushV[pushIndex]); 12 | } 13 | if(s.top() == popV[popIndex]){ 14 | s.pop(); 15 | popIndex++; 16 | } 17 | pushIndex++; 18 | } 19 | while(!s.empty() && s.top() == popV[popIndex]){ 20 | popIndex++; 21 | s.pop(); 22 | } 23 | return s.empty(); 24 | } 25 | }; -------------------------------------------------------------------------------- /iqiyi-8246859/2.boringCattleSheep.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | using namespace std; 5 | 6 | inline double C2(int n) 7 | { 8 | return n*(n - 1) / 2.0; 9 | } 10 | int main() 11 | { 12 | int n, m; 13 | cin >> n >> m; 14 | //当前选择有三种情况 15 | //1 n选2 m选0 16 | //2 n选1 m选1 17 | //3 n选0 m选2 18 | //分别计算三种情况的概率,然后递推 f(k) = 1 + f(k)*p(3)+f(k-1)*p(1)+f(k-2)*p(2) => f(k) = [1+f(k-1)*p(1)+f(k-2)*p(2)]/[1-p(3)] 19 | int all = n + m; 20 | double div = all*(all - 1) / 2.0;//c(all,2) 21 | double f0 = 0, f1 = all / 2.0; 22 | for (int i = 2; i <= m; i++) 23 | { 24 | //还剩i个不无聊人时的概率 25 | //无聊人=all-i 26 | double tmp = (1 + C2(i) / div*f0 + i*(all - i) / div*f1) / (1 - C2(all - i) / div); 27 | f0 = f1; 28 | f1 = tmp; 29 | } 30 | printf("%.1lf\n", round(f1 * 10) / 10); 31 | return 0; 32 | } -------------------------------------------------------------------------------- /sword2offer/2.replaceSpace.cpp: -------------------------------------------------------------------------------- 1 | //替换空格 2 | //https://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423 3 | class Solution { 4 | public: 5 | int error_; 6 | void replaceSpace(char *str,int length) { 7 | int space_count = 0; 8 | error_ = 0; 9 | char *p = str,*q; 10 | while(*p){ 11 | if(*p++ == ' ') 12 | space_count++; 13 | } 14 | q = p + space_count * 2; 15 | if(q - str > length){ 16 | error_ = 1; 17 | return; 18 | } 19 | while(p >= str){ 20 | if(*p == ' '){ 21 | *q-- = '0'; 22 | *q-- = '2'; 23 | *q-- = '%'; 24 | }else{ 25 | *q-- = *p; 26 | } 27 | p--; 28 | } 29 | } 30 | }; -------------------------------------------------------------------------------- /sword2offer/29.GetLeastNumbers_Solution.cpp: -------------------------------------------------------------------------------- 1 | //最小的K个数 2 | //https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf 3 | class Solution { 4 | public: 5 | vector GetLeastNumbers_Solution(vector input, int k) { 6 | set> s; 7 | vector result; 8 | if(k == 0 || k > input.size()) return result; 9 | for(auto& it:input){ 10 | if(s.size() < k){ 11 | s.insert(it); 12 | }else{ 13 | auto itSet = s.begin(); 14 | if(*itSet > it){ 15 | s.erase(itSet); 16 | s.insert(it); 17 | } 18 | } 19 | } 20 | for(auto& it:s){ 21 | result.push_back(it); 22 | } 23 | return result; 24 | } 25 | }; -------------------------------------------------------------------------------- /wangyi-4575457/3.adjustLine.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int result = 0; 6 | 7 | inline void swap(char& a,char& b) { 8 | a = a^b; 9 | b = a^b; 10 | a = a^b; 11 | result++; 12 | } 13 | 14 | int swapString(string s,char ch) 15 | { 16 | result = 0; 17 | char* str = &s[0]; 18 | char* p = str; 19 | while (*p) { 20 | while (*p && *p == ch) { 21 | p++; 22 | } 23 | if (!*p) break; 24 | while (p - 1 >= str && *(p - 1) == ch) { 25 | swap(*p, *(p - 1)); 26 | p--; 27 | } 28 | p++; 29 | } 30 | return result; 31 | } 32 | 33 | int main() 34 | { 35 | string s; 36 | cin >> s; 37 | cout << min(swapString(s, 'B'), swapString(s, 'G')) << endl; 38 | return 0; 39 | } -------------------------------------------------------------------------------- /sword2offer/44.ReverseSentence.cpp: -------------------------------------------------------------------------------- 1 | //翻转单词顺序列 2 | //https://www.nowcoder.com/practice/3194a4f4cf814f63919d0790578d51f3 3 | class Solution { 4 | public: 5 | void reverseString(char* begin,char* end){ 6 | while(begin 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | int n; 10 | cin >> n; 11 | int* v = new int[n]; 12 | for (int i = 0; i < n; i++) 13 | { 14 | cin >> v[i]; 15 | } 16 | vector> dp(n + 1, vector(n + 1, 0)); 17 | for (int i = n - 1; i >= 0; i--) 18 | { 19 | for (int j = n - 1; j >= 0; j--) 20 | { 21 | int p = max(i, j) + 1; 22 | dp[i][j] = 0x7fffffff; 23 | dp[i][j] = min(dp[i][j], dp[i][p] + (j == 0 ? 0 : abs(v[p - 1] - v[j - 1]))); 24 | dp[i][j] = min(dp[i][j], dp[p][j] + (i == 0 ? 0 : abs(v[p - 1] - v[i - 1]))); 25 | } 26 | } 27 | cout << dp[0][0] << endl; 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /sword2offer/27.Permutation.cpp: -------------------------------------------------------------------------------- 1 | //字符串的排列 2 | //https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7 3 | class Solution { 4 | public: 5 | vector Permutation(string str) { 6 | vector result; 7 | if(str.length() == 0) return result; 8 | //用set自动去重复 9 | set s; 10 | Permutation(&str[0],&str[0],s); 11 | for(auto& it:s) 12 | result.push_back(it); 13 | return result; 14 | } 15 | 16 | void Permutation(char* str,char* begin,set& s){ 17 | if(*begin == '\0'){ 18 | s.insert(str); 19 | return; 20 | } 21 | for(char* ch = begin;*ch != '\0';ch++){ 22 | swap(*ch,*begin); 23 | Permutation(str,begin+1,s); 24 | swap(*ch,*begin); 25 | } 26 | } 27 | }; -------------------------------------------------------------------------------- /sword2offer/33.GetUglyNumber_Solution.cpp: -------------------------------------------------------------------------------- 1 | //丑数 2 | //https://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b 3 | class Solution { 4 | public: 5 | int GetUglyNumber_Solution(int index) { 6 | if(index == 0) return 0; 7 | vector uglyNumber; 8 | uglyNumber.push_back(1); 9 | int i2 = 0,i3=0,i5=0; 10 | while(uglyNumber.size() < index){ 11 | //下一个数是235的倍数 12 | int nextVal = min(min(uglyNumber[i2]*2,uglyNumber[i3]*3),uglyNumber[i5]*5); 13 | uglyNumber.push_back(nextVal); 14 | if(uglyNumber[i2]*2 == nextVal) 15 | i2++; 16 | if(uglyNumber[i3]*3 == nextVal) 17 | i3++; 18 | if(uglyNumber[i5]*5 == nextVal) 19 | i5++; 20 | } 21 | return uglyNumber.back(); 22 | } 23 | }; -------------------------------------------------------------------------------- /wangyi-4575457/12.cookie.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | string s; 8 | int n; 9 | cin >> s >> n; 10 | //dp[i][j]表示字符串长度i,余数为j时的结果数目 11 | vector dpi(n, 0);//dpi 12 | dpi[0] = 1; 13 | for (int i = 0; i < s.length(); i++) 14 | { 15 | vector dpi1(n, 0);//dp[i+1] 16 | char ch = s[i]; 17 | for (int j = 0; j < n; j++) 18 | { 19 | for (int k = 0; k < 10; k++) 20 | { 21 | if (ch == 'X' || ch == k + '0') 22 | { 23 | //当前余数会贡献 j * 10 + k%n的结果 24 | dpi1[(j * 10 + k) % n] += dpi[j]; 25 | } 26 | } 27 | } 28 | dpi = dpi1; 29 | } 30 | cout << dpi[0] << endl; 31 | return 0; 32 | } -------------------------------------------------------------------------------- /sword2offer/16.Merge.cpp: -------------------------------------------------------------------------------- 1 | //合并两个排序的链表 2 | //https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337 3 | class Solution { 4 | public: 5 | ListNode* Merge(ListNode* pHead1, ListNode* pHead2) 6 | { 7 | ListNode* pHead = new ListNode(-1); 8 | ListNode* pNode = pHead; 9 | while(pHead1 && pHead2){ 10 | if(pHead1->val > pHead2->val){ 11 | pNode->next = pHead2; 12 | pHead2 = pHead2->next; 13 | }else{ 14 | pNode->next = pHead1; 15 | pHead1 = pHead1->next; 16 | } 17 | pNode = pNode->next; 18 | } 19 | if(pHead1) 20 | pNode->next = pHead1; 21 | if(pHead2) 22 | pNode->next = pHead2; 23 | pNode = pHead->next; 24 | delete pHead; 25 | return pNode; 26 | } 27 | }; -------------------------------------------------------------------------------- /sword2offer/50.duplicate.cpp: -------------------------------------------------------------------------------- 1 | //数组中重复的数字 2 | //https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8 3 | class Solution { 4 | public: 5 | // Parameters: 6 | // numbers: an array of integers 7 | // length: the length of array numbers 8 | // duplication: (Output) the duplicated number in the array number 9 | // Return value: true if the input is valid, and there are some duplications in the array number 10 | // otherwise false 11 | bool duplicate(int numbers[], int length, int* duplication) { 12 | map mapCount; 13 | for(int i = 0;i 1){ 15 | *duplication = numbers[i]; 16 | return true; 17 | } 18 | } 19 | return false; 20 | } 21 | }; -------------------------------------------------------------------------------- /toutiao-8537279/1.maxPoints.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | struct Point 6 | { 7 | int x, y; 8 | }; 9 | 10 | Point points[500001]; 11 | 12 | int main() 13 | { 14 | int n; 15 | cin >> n; 16 | for (size_t i = 0; i < n; i++) 17 | { 18 | scanf("%d%d", &points[i].x, &points[i].y); 19 | } 20 | //按照y升序 x降序排列 21 | sort(points, points + n, 22 | [](Point & p1, Point & p2) 23 | { 24 | return p1.y == p2.y ? p1.x > p2.x : p1.y < p2.y; 25 | }); 26 | printf("%d %d\n", points[n - 1].x, points[n - 1].y); 27 | int maxx = points[n - 1].x; 28 | for (int i = n - 2; i >= 0; i--) 29 | { 30 | if (points[i].x > maxx) 31 | { 32 | printf("%d %d\n", points[i].x, points[i].y); 33 | maxx = points[i].x; 34 | } 35 | } 36 | return 0; 37 | } -------------------------------------------------------------------------------- /meituan-5583018/3.maxRectangleArea.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | int n; 10 | cin >> n; 11 | vector data(n); 12 | for (int i = 0; i> data[i]; 14 | } 15 | long long maxval = 0; 16 | for (int i = 0; i < n; i++) 17 | { 18 | long long sum = 1; 19 | for (int j = i-1; j >= 0; j--) 20 | { 21 | if (data[j] < data[i]) { 22 | break; 23 | } 24 | sum++; 25 | } 26 | for (int j = i+1; j < n; j++) 27 | { 28 | if (data[j] < data[i]) { 29 | break; 30 | } 31 | sum++; 32 | } 33 | maxval = max(maxval, sum*data[i]); 34 | } 35 | cout << maxval << endl; 36 | return 0; 37 | } -------------------------------------------------------------------------------- /meituan-5583018/4.maxSubString.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | using namespace std; 7 | 8 | int main() 9 | { 10 | string s1, s2; 11 | char buf[51]; 12 | cin.getline(buf, 51); 13 | s1.assign(buf); 14 | cin.getline(buf, 51); 15 | s2.assign(buf); 16 | vector> dp(s1.length() + 1, vector(s2.length() + 1, 0)); 17 | int result = 0; 18 | for (size_t i = 1; i <= s1.length(); i++) 19 | { 20 | for (size_t j = 1; j <= s2.length(); j++) 21 | { 22 | if (s1[i - 1] == s2[j - 1]) { 23 | dp[i][j] = dp[i - 1][j - 1] + 1; 24 | result = max(result, dp[i][j]); 25 | } 26 | else { 27 | dp[i][j] = 0; 28 | } 29 | } 30 | } 31 | cout << result << endl; 32 | return 0; 33 | } -------------------------------------------------------------------------------- /iqiyi-8246915/3.squareString.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | using namespace std; 7 | 8 | int lcs(string s1, string s2) { 9 | vector> dp(s1.length() + 1, vector(s2.length() + 1, 0)); 10 | for (int i = 1; i <= s1.length(); i++) 11 | { 12 | for (int j = 1; j <= s2.length(); j++) 13 | { 14 | if (s1[i - 1] == s2[j - 1]) { 15 | dp[i][j] = dp[i - 1][j - 1] + 1; 16 | } 17 | else { 18 | dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); 19 | } 20 | } 21 | } 22 | return dp[s1.length()][s2.length()]; 23 | } 24 | 25 | int main() 26 | { 27 | string s; 28 | cin >> s; 29 | int maxLen = 0; 30 | for (int i = 0; i < s.length(); i++) 31 | { 32 | maxLen = max(maxLen, lcs(string(s.begin(), s.begin() + i + 1), string(s.begin() + i + 1, s.end()))); 33 | } 34 | cout << maxLen * 2 << endl; 35 | return 0; 36 | } -------------------------------------------------------------------------------- /leetcode/6.postorderTraversal.cpp: -------------------------------------------------------------------------------- 1 | //binary-tree-postorder-traversal 2 | //https://www.nowcoder.com/practice/32af374b322342b68460e6fd2641dd1b 3 | class Solution { 4 | public: 5 | vector postorderTraversal(TreeNode *root) { 6 | stack s; 7 | stack result; 8 | TreeNode* p = root; 9 | //把中右左的结果输入到栈中,再把栈输出即为结果 10 | while(p || !s.empty()){ 11 | while(p){ 12 | s.push(p); 13 | result.push(p->val); 14 | p = p->right; 15 | } 16 | if(!s.empty()){ 17 | p = s.top(); 18 | s.pop(); 19 | p = p->left; 20 | } 21 | } 22 | vector res; 23 | while(!result.empty()){ 24 | res.push_back(result.top()); 25 | result.pop(); 26 | } 27 | return res; 28 | } 29 | }; -------------------------------------------------------------------------------- /toutiao-8537279/2.maxArrayValue.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | int n; 10 | cin >> n; 11 | vector data(n); 12 | for (int i = 0; i> data[i]; 14 | } 15 | long long maxval = 0; 16 | for (int i = 0; i < n; i++) 17 | { 18 | long long sum = data[i]; 19 | for (int j = i-1; j >= 0; j--) 20 | { 21 | if (data[j] < data[i]) { 22 | break; 23 | } 24 | sum+=data[j]; 25 | } 26 | for (int j = i+1; j < n; j++) 27 | { 28 | if (data[j] < data[i]) { 29 | break; 30 | } 31 | sum+=data[j]; 32 | } 33 | maxval = max(maxval, sum*data[i]); 34 | } 35 | cout << maxval << endl; 36 | return 0; 37 | } -------------------------------------------------------------------------------- /sword2offer/28.MoreThanHalfNum_Solution.cpp: -------------------------------------------------------------------------------- 1 | //数组中出现次数超过一半的数字 2 | //https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 3 | class Solution { 4 | public: 5 | int MoreThanHalfNum_Solution(vector numbers) { 6 | if(numbers.size() == 0) return 0; 7 | int result = numbers[0]; 8 | int count = 1; 9 | for(int i = 1;i numbers.size() / 2 ? result:0; 26 | } 27 | }; -------------------------------------------------------------------------------- /sword2offer/56.deleteDuplication.cpp: -------------------------------------------------------------------------------- 1 | //删除链表中重复的结点 2 | //https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef 3 | class Solution { 4 | public: 5 | ListNode* deleteDuplication(ListNode* pHead) 6 | { 7 | ListNode* pNewHead = new ListNode(-1); 8 | ListNode* pNode = pHead; 9 | ListNode* pNewNode = pNewHead; 10 | while(pNode){ 11 | ListNode* pTmpNode = pNode; 12 | while(pTmpNode->next && pTmpNode->next->val == pTmpNode->val){ 13 | pTmpNode = pTmpNode->next; 14 | } 15 | if(pNode == pTmpNode){ 16 | pNewNode->next = pTmpNode; 17 | pNewNode = pNewNode->next; 18 | } 19 | pNode = pTmpNode->next; 20 | } 21 | pNewNode->next = NULL; 22 | pNewNode = pNewHead->next; 23 | delete pNewHead; 24 | return pNewNode; 25 | } 26 | }; -------------------------------------------------------------------------------- /nowcoder-9439037/4.crystalRing.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n, m; 8 | vector> range; 9 | cin >> n >> m; 10 | range.resize(n); 11 | for (int i = 0; i < n; i++) 12 | { 13 | cin >> range[i].first >> range[i].second; 14 | } 15 | //用i个珠子得到长度为j的手链的方案数 16 | long long dp[25][105] = {0}; 17 | //只用一种珠子可以得到的方案数 18 | for (int i = range[0].first; i <= range[0].second; i++) 19 | { 20 | dp[1][i] = 1; 21 | } 22 | for (int i = 2; i <= n; i++) 23 | { 24 | for (int j = i; j <= m; j++) 25 | { 26 | //用i颗珠子得到j的方案数 27 | for (int k = range[i-1].first; k <= j && k <= range[i-1].second; k++) 28 | { 29 | dp[i][j] += dp[i-1][j-k]; 30 | } 31 | } 32 | } 33 | cout << dp[n][m] << endl; 34 | return 0; 35 | } -------------------------------------------------------------------------------- /sword2offer/12.Power.cpp: -------------------------------------------------------------------------------- 1 | //数值的整数次方 2 | //https://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00 3 | class Solution { 4 | public: 5 | bool is0(double d){ 6 | return (d-0.0) > -1e-9 && (d-0.0) < 1e-9; 7 | } 8 | int error_; 9 | double Power(double base, int exponent) { 10 | bool neg = exponent < 0; 11 | if(neg && is0(base)){ 12 | error_ = 1; 13 | return 0; 14 | } 15 | error_ = 0; 16 | if(exponent == 0) return 1; 17 | if(neg) exponent = -exponent; 18 | double result = GetPower(base,exponent); 19 | if(neg) result = 1.0/result; 20 | return result; 21 | } 22 | double GetPower(double base,int exponent){ 23 | if(exponent == 1) return base; 24 | double result = GetPower(base*base,exponent/2); 25 | if(exponent & 1) result *= base; 26 | return result; 27 | } 28 | }; -------------------------------------------------------------------------------- /sword2offer/63.GetMedian.cpp: -------------------------------------------------------------------------------- 1 | //数据流中的中位数 2 | //https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1 3 | class Solution { 4 | public: 5 | set smallTop;//存大数 6 | set> bigTop;//存小数 7 | void Insert(int num) 8 | { 9 | if(smallTop.size() <= bigTop.size()){ 10 | bigTop.insert(num); 11 | smallTop.insert(*bigTop.begin()); 12 | bigTop.erase(bigTop.begin()); 13 | }else{ 14 | smallTop.insert(num); 15 | bigTop.insert(*smallTop.begin()); 16 | smallTop.erase(smallTop.begin()); 17 | } 18 | } 19 | 20 | double GetMedian() 21 | { 22 | if(smallTop.size() == 0) return 0; 23 | if(smallTop.size() > bigTop.size()){ 24 | return *smallTop.begin(); 25 | }else{ 26 | return (*smallTop.begin() + *bigTop.begin())/2.0; 27 | } 28 | } 29 | 30 | }; -------------------------------------------------------------------------------- /sword2offer/64.maxInWindows.cpp: -------------------------------------------------------------------------------- 1 | //滑动窗口的最大值 2 | //https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788 3 | class Solution { 4 | public: 5 | vector maxInWindows(const vector& num, unsigned int size) 6 | { 7 | vector result; 8 | if (num.size() < size || size == 0) return result; 9 | list l; 10 | int maxval = num[0]; 11 | for (int i = 0; i 0 && num[l.front()] < num[i]) { 14 | l.pop_front(); 15 | } 16 | maxval = max(num[i], maxval); 17 | } 18 | result.push_back(maxval); 19 | for (int i = size; i < num.size(); i++) { 20 | while (l.size() > 0 && num[l.back()] < num[i]) { 21 | l.pop_back(); 22 | } 23 | while (l.size() > 0 && (i - l.front()) >= size) 24 | { 25 | l.pop_front(); 26 | } 27 | l.push_back(i); 28 | result.push_back(num[l.front()]); 29 | } 30 | return result; 31 | } 32 | }; -------------------------------------------------------------------------------- /tengxun-1725829/1.palindrome.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | using namespace std; 8 | 9 | 10 | int main() 11 | { 12 | string s; 13 | while (cin >> s) { 14 | string sr(s); 15 | reverse(sr.begin(), sr.end()); 16 | vector> dp(s.length() + 1, vector(s.length() + 1, 0)); 17 | for (int i = 1; i <= s.length(); i++) 18 | { 19 | for (int j = 1; j <= sr.length(); j++) 20 | { 21 | if (s[i-1] == sr[j-1]) { 22 | dp[i][j] = dp[i - 1][j - 1] + 1; 23 | } 24 | else { 25 | dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); 26 | } 27 | } 28 | } 29 | cout << s.length() - dp[s.length()][s.length()] << endl; 30 | } 31 | return 0; 32 | } -------------------------------------------------------------------------------- /sword2offer/23.VerifySquenceOfBST.cpp: -------------------------------------------------------------------------------- 1 | //二叉搜索树的后序遍历序列 2 | //https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd 3 | class Solution { 4 | public: 5 | bool VerifySquenceOfBST(vector sequence) { 6 | if(sequence.size() == 0) return false; 7 | return _VerifySquenceOfBST(&sequence[0],sequence.size()); 8 | } 9 | 10 | bool _VerifySquenceOfBST(int* data,int size){ 11 | if(size <= 1) return true; 12 | int root = data[size-1]; 13 | int left_size = 0; 14 | for(int i = 0;i> result; 6 | vector> partition(string s) { 7 | vector item; 8 | dfs(0,s,item); 9 | return result; 10 | } 11 | 12 | void dfs(int cur,string& s,vector& item) 13 | { 14 | if(cur == s.length()){ 15 | result.push_back(item); 16 | return; 17 | } 18 | for(int i = 1;i<=s.length()-cur;i++){ 19 | if(checkpalindrome(s.substr(cur,i))){ 20 | item.push_back(s.substr(cur,i)); 21 | dfs(cur+i,s,item); 22 | item.pop_back(); 23 | } 24 | } 25 | } 26 | 27 | bool checkpalindrome(string s) 28 | { 29 | return s == string(s.rbegin(), s.rend()); 30 | } 31 | }; -------------------------------------------------------------------------------- /wangyi-2811407/1.palindromeSequence.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n,k; 8 | cin >> n; 9 | vector data(n); 10 | for (int i = 0; i < n; i++) 11 | { 12 | cin >> data[i]; 13 | } 14 | int l = 0; 15 | int r = n - 1; 16 | int t = 0; 17 | while (l < r) 18 | { 19 | if (data.size() == 1) break; 20 | if (data[l] == data[r]) 21 | { 22 | l++; 23 | r--; 24 | continue; 25 | } 26 | if (data[l] < data[r]) { 27 | data[l] += data[l + 1]; 28 | data.erase(data.begin() + l + 1); 29 | t++; 30 | r--; 31 | } 32 | else { 33 | data[r] += data[r - 1]; 34 | data.erase(data.begin() + r - 1); 35 | t++; 36 | r--; 37 | } 38 | } 39 | cout << t << endl; 40 | return 0; 41 | } -------------------------------------------------------------------------------- /sword2offer/6.minNumberInRotateArray.cpp: -------------------------------------------------------------------------------- 1 | //旋转数组的最小数字 2 | //https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba 3 | class Solution { 4 | public: 5 | int minNumberInRotateArray(vector rotateArray) { 6 | if(rotateArray.size() == 0) 7 | return 0; 8 | int index1 = 0,index2 = rotateArray.size() - 1; 9 | int mid_index = index1; 10 | //index1始终指着第一递增数组 11 | //index2始终指着第二递增数组 12 | while(rotateArray[index1] >= rotateArray[index2]){ 13 | if(index2 - index1 == 1){ 14 | mid_index = index2; 15 | break; 16 | } 17 | mid_index = index1 + (index2-index1)/2; 18 | if(rotateArray[mid_index] >= rotateArray[index1]) 19 | index1 = mid_index; 20 | if(rotateArray[mid_index] <= rotateArray[index2]) 21 | index2 = mid_index; 22 | } 23 | return rotateArray[mid_index]; 24 | } 25 | }; -------------------------------------------------------------------------------- /sword2offer/41.FindContinuousSequence.cpp: -------------------------------------------------------------------------------- 1 | //和为S的连续正数序列 2 | //https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe 3 | class Solution { 4 | public: 5 | vector > FindContinuousSequence(int sum) { 6 | int curSum = 0; 7 | list l; 8 | vector > result; 9 | vector line; 10 | for(int i = 1;i<=sum/2+sum%2+1;){ 11 | if(curSum < sum){ 12 | curSum += i; 13 | l.push_back(i); 14 | i++; 15 | } 16 | if(curSum == sum && l.size() > 1){ 17 | line.resize(0); 18 | for(auto& it:l){ 19 | line.push_back(it); 20 | } 21 | result.push_back(line); 22 | } 23 | if(curSum >= sum){ 24 | curSum -= l.front(); 25 | l.pop_front(); 26 | } 27 | } 28 | return result; 29 | } 30 | }; -------------------------------------------------------------------------------- /wangyi-4575457/6.workSchedule.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | vector works; 6 | 7 | int result = 0; 8 | 9 | void dfs(int scheme[6],int index) 10 | { 11 | if (index == works.size()) 12 | { 13 | result++; 14 | return; 15 | } 16 | if (works[index].size() == 0) { 17 | dfs(scheme, index + 1); 18 | return; 19 | } 20 | for (int i = 0; i < works[index].size(); i++) 21 | { 22 | if (scheme[works[index][i] - '0']) continue; 23 | scheme[works[index][i] - '0'] = 1; 24 | dfs(scheme, index + 1); 25 | scheme[works[index][i] - '0'] = 0; 26 | } 27 | } 28 | //这里题目描述不清晰,其实只要每个人做一个事情就行了,没必要所有事情都做完,回溯即可 29 | int main() 30 | { 31 | int n; 32 | cin >> n; 33 | works.resize(n); 34 | for (int i = 0; i < n; i++) 35 | cin >> works[i]; 36 | int scheme[6] = {0}; 37 | dfs(scheme, 0); 38 | cout << result << endl; 39 | return 0; 40 | } -------------------------------------------------------------------------------- /wangyi-4575457/1.doubleCore.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n; 8 | cin >> n; 9 | vector data(n),a(n); 10 | int sum = 0; 11 | for (int i = 0; i < n; i++) 12 | { 13 | cin >> data[i]; 14 | a[i] = data[i] / 1024; 15 | sum += a[i]; 16 | } 17 | int m = sum / 2; 18 | //背包问题 dp[i][j]用j个数得到最接近i的结果 19 | vector> dp(m + 1, vector(n)); 20 | for (int i = 0; i < n; i++) { 21 | dp[0][i] = 0; 22 | } 23 | for (int i = 1; i < m + 1; i++) { 24 | dp[i][0] = i >= a[0] ? a[0] : 0; 25 | } 26 | for (int i = 1; i < m + 1; i++) 27 | { 28 | for (int j = 1; j < n; j++) 29 | { 30 | dp[i][j] = max(dp[i - 1][j], max(dp[i][j - 1], i >= a[j] ? dp[i - a[j]][j - 1] + a[j] : 0)); 31 | } 32 | } 33 | int sub = m - dp[m][n - 1]; 34 | cout << (m + sub + sum % 2) * 1024 << endl; 35 | return 0; 36 | } -------------------------------------------------------------------------------- /iqiyi-8246879/2.lastNumber.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | using namespace std; 9 | 10 | 11 | long long getSum(long long num) 12 | { 13 | long long sum = 0; 14 | while (num) 15 | { 16 | sum += num; 17 | num /= 10; 18 | } 19 | return sum; 20 | } 21 | 22 | int main() 23 | { 24 | long long sum; 25 | cin >> sum; 26 | long long l = 0; 27 | long long r = sum; 28 | long long num = -1; 29 | 30 | while (l <= r) 31 | { 32 | long long mid = l + (r - l) / 2; 33 | long long newSum = getSum(mid); 34 | if (newSum == sum) 35 | { 36 | num = mid; 37 | break; 38 | } 39 | else if (newSum > sum) { 40 | r = mid - 1; 41 | } 42 | else { 43 | l = mid + 1; 44 | } 45 | 46 | } 47 | cout << num << endl; 48 | return 0; 49 | } -------------------------------------------------------------------------------- /leetcode/19.minCut.cpp: -------------------------------------------------------------------------------- 1 | //palindrome-partitioning-ii 2 | //https://www.nowcoder.com/practice/1025ffc2939547e39e8a38a955de1dd3 3 | class Solution { 4 | public: 5 | int minCut(string s) { 6 | int len = s.length(); 7 | //dp[i] 表示s中0~i子字符串所需要的最小切割数 8 | vector dp(len,0); 9 | for(int i = 1;iright = NULL; 10 | //返回头结点 11 | pRootOfTree = pLastNode; 12 | while(pRootOfTree && pRootOfTree->left) 13 | pRootOfTree = pRootOfTree->left; 14 | return pRootOfTree; 15 | } 16 | 17 | void ConvertNode(TreeNode* pNode,TreeNode** pLastNode){ 18 | if(pNode == NULL) return; 19 | //中序遍历 20 | if(pNode->left){ 21 | ConvertNode(pNode->left,pLastNode); 22 | } 23 | pNode->left = *pLastNode; 24 | if(*pLastNode) 25 | (*pLastNode)->right = pNode; 26 | *pLastNode = pNode; 27 | if(pNode->right) 28 | ConvertNode(pNode->right,pLastNode); 29 | } 30 | }; -------------------------------------------------------------------------------- /wangyi-9763997/6.rectangle.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | set xSet; 8 | set ySet; 9 | int n; 10 | cin >> n; 11 | vector x1(n); 12 | vector y1(n); 13 | vector x2(n); 14 | vector y2(n); 15 | for (int i = 0; i < n; i++) 16 | cin >> x1[i]; 17 | for (int i = 0; i < n; i++) 18 | cin >> y1[i]; 19 | for (int i = 0; i < n; i++) 20 | cin >> x2[i]; 21 | for (int i = 0; i < n; i++) 22 | cin >> y2[i]; 23 | xSet.insert(x1.begin(), x1.end()); 24 | xSet.insert(x2.begin(), x2.end()); 25 | ySet.insert(y1.begin(), y1.end()); 26 | ySet.insert(y2.begin(), y2.end()); 27 | int result = 0; 28 | //遍历所有的交点和顶点,最终重叠区域一定是一个矩形,矩形必定由交点和顶点构成 29 | for(auto& x:xSet) 30 | for (auto& y : ySet) { 31 | int cnt = 0; 32 | for (int i = 0; i < n; i++) { 33 | if (x >= x1[i] && x < x2[i] && y >= y1[i] && y < y2[i]) 34 | cnt++; 35 | } 36 | result = max(result, cnt); 37 | } 38 | cout << result << endl; 39 | return 0; 40 | } -------------------------------------------------------------------------------- /sword2offer/17.HasSubtree.cpp: -------------------------------------------------------------------------------- 1 | //树的子结构 2 | //https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88 3 | class Solution { 4 | public: 5 | bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) 6 | { 7 | if(pRoot1 == NULL || pRoot2 == NULL) return false; 8 | bool ret = false; 9 | if(pRoot1->val == pRoot2->val) 10 | ret = Tree1HasTree2(pRoot1,pRoot2); 11 | if(!ret && pRoot1->left) 12 | ret = HasSubtree(pRoot1->left,pRoot2); 13 | if(!ret && pRoot1->right) 14 | ret = HasSubtree(pRoot1->right,pRoot2); 15 | return ret; 16 | } 17 | 18 | bool Tree1HasTree2(TreeNode* pRoot1,TreeNode* pRoot2) 19 | { 20 | if(pRoot2 == NULL) return true; 21 | if(pRoot1 == NULL) return false; 22 | if(pRoot1->val != pRoot2->val){ 23 | return false; 24 | } 25 | return Tree1HasTree2(pRoot1->left,pRoot2->left) && 26 | Tree1HasTree2(pRoot1->right,pRoot2->right); 27 | } 28 | }; -------------------------------------------------------------------------------- /wangyi-6910869/6.bracketsLCS.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | using namespace std; 8 | 9 | bool check(string& s) { 10 | int count = 0; 11 | for (auto& it : s) { 12 | if (it == '(') { 13 | count++; 14 | } 15 | else { 16 | count--; 17 | } 18 | if (count < 0) return false; 19 | } 20 | return count == 0; 21 | } 22 | 23 | int main() 24 | { 25 | string s; 26 | cin >> s; 27 | set record; 28 | //lcs的长度必定是s.length-1 所以只能改变一个字符,改变后还得继续是一个合法括号 29 | for (int i = 0; i < s.length(); i++) { 30 | string tmp(s); 31 | tmp.erase(i, 1); 32 | for (int j = 0; j < tmp.length(); j++) { 33 | string s1(tmp); 34 | s1.insert(j,1, s[i]); 35 | if (check(s1)) { 36 | record.insert(s1); 37 | } 38 | } 39 | } 40 | cout << record.size() - 1 << endl; 41 | return 0; 42 | } -------------------------------------------------------------------------------- /toutiao-8537039/2.maxABString.cpp: -------------------------------------------------------------------------------- 1 | //编程题2 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | using namespace std; 8 | 9 | int main() 10 | { 11 | string s; 12 | int m, n; 13 | cin >> n >> m; 14 | cin >> s; 15 | 16 | vector count; 17 | count.push_back(0); 18 | int numA = 0; 19 | for (size_t i = 0; i < s.length(); i++) 20 | { 21 | if (s[i] == 'a') numA++; 22 | count.push_back(numA); 23 | } 24 | int l = 0; 25 | int r = n; 26 | int result = 0; 27 | while (l < r) 28 | { 29 | int mid = l + (r - l) / 2; 30 | bool flag = false; 31 | //mid长度的连续子串是否可以得到 32 | for (size_t i = 0; i + mid <= n; i++) 33 | { 34 | if ((m >= (count[i + mid] - count[i])) || 35 | (m >= (mid - count[i + mid] + count[i]))) 36 | { 37 | flag = true; 38 | break; 39 | } 40 | } 41 | if (flag) { 42 | result = mid; 43 | l = mid + 1; 44 | } 45 | else 46 | r = mid; 47 | } 48 | cout << result << endl; 49 | return 0; 50 | } -------------------------------------------------------------------------------- /wangyi-6910869/2.oppositeNumber.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | using namespace std; 7 | 8 | int main() 9 | { 10 | int n; 11 | cin >> n; 12 | stringstream ss; 13 | ss << n; 14 | string s1 = ss.str(); 15 | string s2 = s1; 16 | reverse(s2.begin(), s2.end()); 17 | bool step = 0; 18 | for (int i = s1.length() - 1; i >= 0; i--) 19 | { 20 | int sum = (s1[i] - '0') + (s2[i] - '0') + step; 21 | if (sum >= 10) { 22 | step = 1; 23 | sum %= 10; 24 | } 25 | else { 26 | step = 0; 27 | } 28 | s1[i] = '0' + sum; 29 | } 30 | if (step) 31 | { 32 | s1 = "1" + s1; 33 | } 34 | auto it = s1.begin(); 35 | while (it != s1.end()) 36 | { 37 | if (*it == '0') { 38 | it = s1.erase(it); 39 | } 40 | else { 41 | break; 42 | } 43 | } 44 | cout << s1 << endl; 45 | return 0; 46 | } 47 | -------------------------------------------------------------------------------- /leetcode/2.evalRPN.cpp: -------------------------------------------------------------------------------- 1 | //evaluate-reverse-polish-notation 2 | //https://www.nowcoder.com/practice/22f9d7dd89374b6c8289e44237c70447 3 | class Solution { 4 | public: 5 | int evalRPN(vector &tokens) { 6 | stack s; 7 | for(auto& token:tokens){ 8 | if(token == "+" || token == "-" || token == "*" || token == "/"){ 9 | if(s.size() < 2) return 0; 10 | int val1 = s.top(); 11 | s.pop(); 12 | int val2 = s.top(); 13 | s.pop(); 14 | if(token == "+") 15 | s.push(val2+val1); 16 | else if(token == "-") 17 | s.push(val2-val1); 18 | else if(token == "*") 19 | s.push(val2*val1); 20 | else 21 | s.push(val2/val1); 22 | }else{ 23 | int val = atoi(token.c_str()); 24 | s.push(val); 25 | } 26 | } 27 | return s.empty()? 0 : s.top(); 28 | } 29 | }; -------------------------------------------------------------------------------- /sword2offer/60.Print.cpp: -------------------------------------------------------------------------------- 1 | //把二叉树打印成多行 2 | //https://www.nowcoder.com/practice/445c44d982d04483b04a54f298796288 3 | class Solution { 4 | public: 5 | vector > Print(TreeNode* pRoot) { 6 | queue q; 7 | vector> result; 8 | if(pRoot == NULL) return result; 9 | q.push(pRoot); 10 | TreeNode* last,*nlast = pRoot; 11 | vector line; 12 | while(!q.empty()){ 13 | TreeNode* pNode = q.front(); 14 | q.pop(); 15 | line.push_back(pNode->val); 16 | if(pNode->left) 17 | q.push(pNode->left); 18 | if(pNode->right) 19 | q.push(pNode->right); 20 | if(!q.empty()) last = q.back(); 21 | if(pNode == nlast){ 22 | result.push_back(line); 23 | line.resize(0); 24 | nlast = last; 25 | } 26 | } 27 | return result; 28 | } 29 | 30 | }; -------------------------------------------------------------------------------- /sword2offer/24.FindPath.cpp: -------------------------------------------------------------------------------- 1 | //二叉树中和为某一值的路径 2 | //https://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca 3 | class Solution { 4 | public: 5 | vector > FindPath(TreeNode* root,int expectNumber) { 6 | vector > result; 7 | if(root == NULL) return result; 8 | vector path; 9 | _FindPath(root,path,0,expectNumber,result); 10 | return result; 11 | } 12 | 13 | void _FindPath(TreeNode* node,vector path,int currentNumber, 14 | int expectNumber,vector >& result){ 15 | path.push_back(node->val); 16 | if(node->left){ 17 | _FindPath(node->left,path,currentNumber+node->val,expectNumber,result); 18 | } 19 | if(node->right){ 20 | _FindPath(node->right,path,currentNumber+node->val,expectNumber,result); 21 | } 22 | if(node->left == NULL && node->right == NULL){ 23 | if(currentNumber+node->val == expectNumber){ 24 | result.push_back(path); 25 | } 26 | } 27 | } 28 | }; -------------------------------------------------------------------------------- /toutiao-8537209/2.strings.cpp: -------------------------------------------------------------------------------- 1 | //编程题2 手串 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | using namespace std; 10 | 11 | int main() 12 | { 13 | int m, n, c; 14 | cin >> n >> m >> c; 15 | vector> strings(n); 16 | vector> colors(c); 17 | for (size_t i = 0; i < n; i++) 18 | { 19 | int k; 20 | cin >> k; 21 | strings[i].resize(k); 22 | for (size_t j = 0; j < k; j++) 23 | { 24 | cin >> strings[i][j]; 25 | colors[strings[i][j] - 1].push_back(i + 1); 26 | } 27 | } 28 | int result = 0; 29 | for (auto& it : colors) 30 | { 31 | if (it.size() <= 1) 32 | { 33 | //01种颜色 不会冲突 34 | continue; 35 | } 36 | //检验环 37 | if (n - it[it.size() - 1] + it[0] < m) { 38 | result++; 39 | continue; 40 | } 41 | for (size_t i = 1; i < it.size(); i++) 42 | { 43 | if (it[i] - it[i - 1] < m) { 44 | result++; 45 | break; 46 | } 47 | } 48 | } 49 | cout << result << endl; 50 | return 0; 51 | } 52 | -------------------------------------------------------------------------------- /wangyi-4575457/9.paintBoard.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n; 8 | cin >> n; 9 | vector maxCount(n, 0); 10 | vector lastChar(n); 11 | vector curCount(n, 1); 12 | for (int i = 0; i < n; i++) { 13 | string s; 14 | cin >> s; 15 | for (int j = 0; j < s.length(); j++) 16 | { 17 | if (i == 0) { 18 | lastChar[j] = s[j]; 19 | } 20 | else { 21 | if (s[j] == lastChar[j]) { 22 | curCount[j]++; 23 | } 24 | else { 25 | maxCount[j] = max(maxCount[j], curCount[j]); 26 | curCount[j] = 1; 27 | } 28 | lastChar[j] = s[j]; 29 | } 30 | } 31 | } 32 | int result = 0; 33 | //处理最后的情况 34 | for (int i = 0; i < n; i++) { 35 | maxCount[i] = max(maxCount[i], curCount[i]); 36 | result = max(result, maxCount[i]); 37 | } 38 | cout << result << endl; 39 | return 0; 40 | } -------------------------------------------------------------------------------- /sword2offer/61.Serialize.cpp: -------------------------------------------------------------------------------- 1 | //序列化二叉树 2 | //https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84 3 | class Solution { 4 | public: 5 | char* Serialize(TreeNode *root) { 6 | stringstream ss; 7 | Serialize(root,ss); 8 | char* str = new char[ss.str().length()+1]; 9 | strcpy(str,ss.str().c_str()); 10 | return str; 11 | } 12 | 13 | void Serialize(TreeNode *root,stringstream& ss){ 14 | if(root == NULL){ 15 | ss<<"# "; 16 | return ; 17 | } 18 | ss<val<<" "; 19 | Serialize(root->left,ss); 20 | Serialize(root->right,ss); 21 | } 22 | TreeNode* Deserialize(char *str) { 23 | stringstream ss; 24 | ss.str(str); 25 | return Deserialize(ss); 26 | } 27 | 28 | TreeNode* Deserialize(stringstream& ss){ 29 | string val = ""; 30 | ss>>val; 31 | if(val == "#") return NULL; 32 | TreeNode* pNode = new TreeNode(atoi(val.c_str())); 33 | pNode->left = Deserialize(ss); 34 | pNode->right = Deserialize(ss); 35 | return pNode; 36 | } 37 | }; -------------------------------------------------------------------------------- /sword2offer/53.isNumeric.cpp: -------------------------------------------------------------------------------- 1 | //表示数值的字符串 2 | //https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2 3 | class Solution { 4 | public: 5 | bool isNumeric(char* string) 6 | { 7 | if(string == NULL) return false; 8 | char* p = string; 9 | if(*p == '+' || *p == '-') 10 | p++; 11 | bool dotflag = false; 12 | bool eflag = false; 13 | while(*p != '\0'){ 14 | if(*p >= '0' && *p <= '9'){ 15 | p++; 16 | continue; 17 | } 18 | if(*p == '.'){ 19 | if(dotflag || eflag) return false; 20 | dotflag = true; 21 | p++; 22 | continue; 23 | } 24 | if(*p == 'e' || *p == 'E'){ 25 | if(eflag) return false; 26 | eflag = true; 27 | p++; 28 | if(*p == '+' ||*p == '-') 29 | p++; 30 | if(p == '\0') return false; 31 | continue; 32 | }else 33 | return false; 34 | } 35 | return true; 36 | } 37 | 38 | }; -------------------------------------------------------------------------------- /wangyi-4575457/11.pileBricks.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int n; 8 | cin >> n; 9 | vector height(n); 10 | int sum = 0; 11 | for (int i = 0; i < n; i++) { 12 | cin >> height[i]; 13 | sum += height[i]; 14 | } 15 | const int minValue = -0x3d3d3d3d; 16 | //dp[i][j] 摆了i块砖 高度差为j时低塔高度 17 | //dp[i][j] = dp[i-1][j] 不摆 18 | // dp[i-1][j+h]+h 摆在低塔 仍为低塔 19 | // dp[i-1][h-j]+h-j 摆在低塔 变为高塔 20 | // dp[i-1][j-h] 摆在高塔 仍为高塔 21 | //求4个值的最大值 22 | vector dpi(sum + 1, minValue);//dpi 23 | vector dpi_1(dpi);//dp[i-1] 24 | int result = 0; 25 | dpi_1[0] = 0; 26 | for (int i = 1; i <= n; i++) 27 | { 28 | int h = height[i - 1]; 29 | for (int j = 0; j < sum+1; j++) 30 | { 31 | dpi[j] = max(dpi_1[j], max(j + h <= sum ? dpi_1[j + h] + h : minValue, max(h - j >= 0 ? dpi_1[h - j] + h - j : minValue, j - h >= 0 ? dpi_1[j - h] : minValue))); 32 | } 33 | dpi_1 = dpi; 34 | } 35 | cout << (dpi[0] > 0 ? dpi[0] : -1) << endl; 36 | return 0; 37 | } -------------------------------------------------------------------------------- /wangyi-6910869/8.shootingGame.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | int n; 10 | cin >> n; 11 | int* x = new int[n]; 12 | int* y = new int[n]; 13 | for (int i = 0; i < n; i++) 14 | { 15 | cin >> x[i]; 16 | } 17 | for (int i = 0; i < n; i++) 18 | { 19 | cin >> y[i]; 20 | } 21 | int maxcnt = 0; 22 | //A 23 | for (int i1 = 0; i1 < n; i1++) 24 | { 25 | //B 26 | for (int i2 = i1+1; i2 < n; i2++) 27 | { 28 | //C 29 | for (int i3 = 0; i3 < n; i3++) 30 | { 31 | if (i1 == i3 || i3 == i2 || (x[i1]-x[i2])*(y[i3] - y[i2]) == (y[i1] - y[i2])*(x[i3] - x[i2])) 32 | { 33 | continue; 34 | } 35 | int cnt = 0; 36 | for (int i4 = 0; i4 < n; i4++) 37 | { 38 | //共线或垂直 39 | if ((x[i1] - x[i2])*(y[i1] - y[i4]) == (y[i1] - y[i2])*(x[i1] - x[i4]) || 40 | (x[i1] - x[i2])*(x[i3] - x[i4]) == -(y[i1] - y[i2])*(y[i3] - y[i4])) 41 | { 42 | cnt++; 43 | } 44 | maxcnt = max(maxcnt, cnt); 45 | } 46 | } 47 | } 48 | } 49 | cout << (maxcnt == 0 ? n : maxcnt) << endl; 50 | delete x; 51 | delete y; 52 | return 0; 53 | } -------------------------------------------------------------------------------- /sword2offer/36.FindFirstCommonNode.cpp: -------------------------------------------------------------------------------- 1 | //两个链表的第一个公共结点 2 | //https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46 3 | class Solution { 4 | public: 5 | int GetListLength(ListNode* pNode){ 6 | int length = 0; 7 | while(pNode){ 8 | length++; 9 | pNode = pNode->next; 10 | } 11 | return length; 12 | } 13 | ListNode* GetKthNode(ListNode* pNode,int k){ 14 | for(int i = 0;inext; 16 | } 17 | return pNode; 18 | } 19 | ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { 20 | int len1 = GetListLength(pHead1); 21 | int len2 = GetListLength(pHead2); 22 | if(len1 > len2){ 23 | pHead1 = GetKthNode(pHead1,len1-len2); 24 | }else if(len1 < len2){ 25 | pHead2 = GetKthNode(pHead2,len2-len1); 26 | } 27 | ListNode* pNode = NULL; 28 | while(pHead1 && pHead2){ 29 | if(pHead1 == pHead2){ 30 | pNode = pHead1; 31 | break; 32 | } 33 | pHead1 = pHead1->next; 34 | pHead2 = pHead2->next; 35 | } 36 | return pNode; 37 | } 38 | }; -------------------------------------------------------------------------------- /leetcode/3.maxPoints.cpp: -------------------------------------------------------------------------------- 1 | //max-points-on-a-line 2 | //https://www.nowcoder.com/practice/bfc691e0100441cdb8ec153f32540be2 3 | class Solution { 4 | public: 5 | int maxPoints(vector &points) { 6 | int result = points.size() < 2 ? points.size() : 2; 7 | for (int i = 0; i < points.size(); i++) 8 | { 9 | int vtl = 0; 10 | map mapSlope; 11 | int same = 0; 12 | for (int j = 0; j < points.size(); j++) 13 | { 14 | if (points[i].x == points[j].x && 15 | points[i].y == points[j].y) { 16 | //相同的点 17 | same++; 18 | }else if (points[i].x == points[j].x) 19 | { 20 | //垂直的点特殊处理 21 | vtl++; 22 | } 23 | else { 24 | mapSlope[1.0*(points[j].y - points[i].y) / (points[j].x - points[i].x)]++; 25 | } 26 | } 27 | result = max(vtl + same, result); 28 | for (auto& it : mapSlope) { 29 | result = max(result, it.second + same); 30 | } 31 | } 32 | return result; 33 | } 34 | }; -------------------------------------------------------------------------------- /wangyi-2811407/5.reverseNumber.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | using namespace std; 7 | int main() 8 | { 9 | int x, y; 10 | cin >> x >> y; 11 | stringstream xss, yss; 12 | xss << x; 13 | yss << y; 14 | string xs = xss.str(); 15 | reverse(xs.begin(), xs.end()); 16 | string ys = yss.str(); 17 | reverse(ys.begin(), ys.end()); 18 | while (xs.length() < ys.length()) { 19 | xs = "0" + xs; 20 | } 21 | while (xs.length() > ys.length()) { 22 | ys = "0" + ys; 23 | } 24 | int step = 0; 25 | for (int i = xs.length() - 1; i >= 0; i--) { 26 | int sum = ys[i] - '0' + xs[i] - '0' + step; 27 | if (sum >= 10) { 28 | sum %= 10; 29 | step = 1; 30 | } 31 | else { 32 | step = 0; 33 | } 34 | xs[i] = sum + '0'; 35 | } 36 | if (step == 1) 37 | xs = "1" + xs; 38 | reverse(xs.begin(), xs.end()); 39 | auto it = xs.begin(); 40 | while (it != xs.end()) { 41 | if (*it == '0') 42 | it = xs.erase(it); 43 | else 44 | break; 45 | } 46 | cout << xs << endl; 47 | return 0; 48 | } -------------------------------------------------------------------------------- /toutiao-8537140/3.room.cpp: -------------------------------------------------------------------------------- 1 | //编程题2 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | 7 | int main() { 8 | int n, x; 9 | while (cin >> n) { 10 | cin >> x; 11 | if (n == 0) continue; 12 | vector data(n); 13 | long long mindata = 0x7fffffff; 14 | for (size_t i = 0; i < n; i++) { 15 | cin >> data[i]; 16 | mindata = min(data[i], mindata); 17 | } 18 | if (mindata == data[x - 1]) { 19 | for (auto& it : data) { 20 | it -= mindata; 21 | } 22 | data[x - 1] = mindata * n; 23 | } else { 24 | //从x往前出发,遇到的第一个最小值就是开始点 25 | int begin = x - 1 + n; 26 | int count = 0; 27 | while (mindata != data[begin % n]) { 28 | data[begin % n]--; 29 | count++; 30 | begin--; 31 | } 32 | for (auto& it : data) { 33 | it -= mindata; 34 | } 35 | data[begin % n] = mindata * n + count; 36 | } 37 | for (size_t i = 0; i < n; i++) 38 | { 39 | cout << data[i] << (i == n - 1 ? '\n' : ' '); 40 | } 41 | } 42 | 43 | return 0; 44 | } -------------------------------------------------------------------------------- /sword2offer/19.printMatrix.cpp: -------------------------------------------------------------------------------- 1 | //顺时针打印矩阵 2 | //https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a 3 | class Solution 4 | { 5 | public: 6 | vector printMatrix(vector > matrix) 7 | { 8 | vector result; 9 | int rows = matrix.size(); 10 | int cols = matrix[0].size(); 11 | if (rows == 0 || cols == 0) return result; 12 | int loop_times = (min(rows, cols) + 1) / 2; 13 | for (int i = 0; i < loop_times; i++) 14 | { 15 | //左到右 16 | for (int j = i; j < cols - i; j++) 17 | { 18 | result.push_back(matrix[i][j]); 19 | } 20 | //上到下 21 | for (int j = i + 1; j < rows - i; j++) 22 | { 23 | result.push_back(matrix[j][cols - i - 1]); 24 | } 25 | //右到左(考虑单行的情况) 26 | for (int j = cols - i - 2; i + 1 < rows - i && j >= i; j--) 27 | { 28 | result.push_back(matrix[rows - i - 1][j]); 29 | } 30 | //下到上(考虑单列的情况) 31 | for (int j = rows - i - 2; cols - i - 2 >=i && j > i; j--) 32 | { 33 | result.push_back(matrix[j][i]); 34 | } 35 | } 36 | return result; 37 | } 38 | }; -------------------------------------------------------------------------------- /sword2offer/37.GetNumberOfK.cpp: -------------------------------------------------------------------------------- 1 | //数字在排序数组中出现的次数 2 | //https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2 3 | class Solution { 4 | public: 5 | int GetNumberOfK(vector data ,int k) { 6 | int index1 = GetFirstOfK(data,k); 7 | int index2 = GetLastOfK(data,k); 8 | if(index1 == -1) return 0; 9 | return index2 - index1+1; 10 | } 11 | int GetFirstOfK(vector data,int k){ 12 | int l = 0; 13 | int r = data.size()-1; 14 | while(l <= r){ 15 | int mid = l + (r-l)/2; 16 | if(data[mid] >= k) 17 | r = mid-1; 18 | if(data[mid] < k) 19 | l = mid+1; 20 | if(data[mid] == k && (mid == 0 || data[mid-1] != k)) 21 | return mid; 22 | } 23 | return -1; 24 | } 25 | int GetLastOfK(vector data,int k){ 26 | int l = 0; 27 | int r = data.size()-1; 28 | while(l <= r){ 29 | int mid = l + (r-l)/2; 30 | if(data[mid] > k) 31 | r = mid-1; 32 | if(data[mid] <= k) 33 | l = mid+1; 34 | if(data[mid] == k && (mid == data.size()-1 || data[mid+1] != k)) 35 | return mid; 36 | } 37 | return -1; 38 | } 39 | }; -------------------------------------------------------------------------------- /nowcoder-9439037/2.swamp.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | struct Arc 6 | { 7 | int b, e; 8 | int cost; 9 | }; 10 | 11 | int main() 12 | { 13 | //求最小生成树即可 14 | int N, M; 15 | cin >> N >> M; 16 | vector data(M); 17 | //树的集合 18 | vector> tree(N); 19 | for (int i = 0; i < M; i++) 20 | { 21 | cin >> data[i].b >> data[i].e >> data[i].cost; 22 | } 23 | for (int i = 0; i < N; i++) 24 | { 25 | tree[i].push_back(i + 1); 26 | } 27 | sort(data.begin(), data.end(), [](Arc& c1, Arc& c2) {return c1.cost < c2.cost; }); 28 | int longestWood = 0; 29 | for (int i = 0; i < M; i++) 30 | { 31 | int b = data[i].b; 32 | int e = data[i].e; 33 | int bIndex = -1; 34 | int eIndex = -1; 35 | for (int i = 0; i < N; i++) 36 | { 37 | if (find(tree[i].begin(),tree[i].end(),b) != tree[i].end()) 38 | { 39 | bIndex = i; 40 | } 41 | if (find(tree[i].begin(), tree[i].end(), e) != tree[i].end()) 42 | { 43 | eIndex = i; 44 | } 45 | } 46 | if (bIndex == eIndex) 47 | { 48 | //已经在同一个集合中 49 | continue; 50 | } 51 | tree[bIndex].insert(tree[bIndex].end(), tree[eIndex].begin(), tree[eIndex].end()); 52 | tree[eIndex].clear(); 53 | longestWood = max(longestWood, data[i].cost); 54 | } 55 | cout << longestWood << endl; 56 | return 0; 57 | } -------------------------------------------------------------------------------- /tengxun-1725829/ReadMe.md: -------------------------------------------------------------------------------- 1 | [腾讯2017暑期实习生编程题](https://www.nowcoder.com/test/1725829/summary) 2 | ==================== 3 | 4 | + 编程题1 构造回文 5 | 6 | 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 7 | 输出需要删除的字符个数。 8 | 9 | 输入描述: 10 | 11 | 输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000. 12 | 13 | 14 | 15 | 16 | 输出描述: 17 | 18 | 对于每组数据,输出一个整数,代表最少需要删除的字符个数。 19 | 20 | 21 | 输入例子1: 22 | abcda 23 | google 24 | 25 | 输出例子1: 26 | 2 27 | 2 28 | 29 | + 编程题2 算法基础-字符移位 30 | 31 | 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。 32 | 你能帮帮小Q吗? 33 | 34 | 35 | 输入描述: 36 | 37 | 输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000. 38 | 39 | 40 | 41 | 42 | 输出描述: 43 | 44 | 对于每组数据,输出移位后的字符串。 45 | 46 | 47 | 输入例子1: 48 | AkleBiCeilD 49 | 50 | 输出例子1: 51 | kleieilABCD 52 | 53 | + 编程题3 有趣的数字 54 | 55 | 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 56 | 57 | 58 | 输入描述: 59 | 60 | 输入包含多组测试数据。 61 | 62 | 对于每组测试数据: 63 | 64 | N - 本组测试数据有n个数 65 | 66 | a1,a2...an - 需要计算的数据 67 | 68 | 保证: 69 | 70 | 1<=N<=100000,0<=ai<=INT_MAX. 71 | 72 | 73 | 74 | 75 | 输出描述: 76 | 77 | 对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。 78 | 79 | 80 | 输入例子1: 81 | 6 82 | 45 12 45 32 5 6 83 | 84 | 输出例子1: 85 | 1 2 -------------------------------------------------------------------------------- /sword2offer/66.movingCount.cpp: -------------------------------------------------------------------------------- 1 | //机器人的运动范围 2 | //https://www.nowcoder.com/practice/6e5207314b5241fb83f2329e89fdecc8 3 | class Solution { 4 | public: 5 | int movingCount(int threshold, int rows, int cols) 6 | { 7 | bool* visited = new bool[rows*cols]; 8 | memset(visited,false,sizeof(bool)*rows*cols); 9 | int count = 0; 10 | dfs(threshold,rows,cols,0,0,visited,count); 11 | delete visited; 12 | return count; 13 | } 14 | 15 | void dfs(int threshold,int rows,int cols,int i,int j,bool* visited,int& count){ 16 | if(i < 0 || i >= rows || j < 0 || j >= cols || visited[i*cols+j]){ 17 | return; 18 | } 19 | static int dir[][2] = { 20 | {0,-1}, 21 | {0,1}, 22 | {-1,0}, 23 | {1,0} 24 | }; 25 | if(getSum(i) + getSum(j) <= threshold){ 26 | count++; 27 | visited[i*cols+j] = true; 28 | for(int k = 0;k<4;k++){ 29 | dfs(threshold,rows,cols,i+dir[k][0],j+dir[k][1],visited,count); 30 | } 31 | } 32 | } 33 | 34 | int getSum(int num){ 35 | int sum = 0; 36 | while(num){ 37 | sum += num%10; 38 | num /= 10; 39 | } 40 | return sum; 41 | } 42 | }; -------------------------------------------------------------------------------- /sword2offer/57.match.cpp: -------------------------------------------------------------------------------- 1 | //正则表达式匹配 2 | //https://www.nowcoder.com/practice/45327ae22b7b413ea21df13ee7d6429c 3 | class Solution { 4 | public: 5 | bool match(char* str, char* pattern) 6 | { 7 | //最好用动态规划来做 状态矩阵 8 | //1 0 0 0 0 0 0 0 9 | // a b * a c * a 10 | //0 a 1 0 1 0 0 0 0 11 | //0 a 0 0 0 1 0 1 0 12 | //0 a 0 0 0 0 0 0 1 13 | int rows = strlen(str); 14 | int cols = strlen(pattern); 15 | vector> dp(rows+1,vector(cols+1,false)); 16 | dp[0][0] = true;//空字符串是相等的 17 | //对于第一行 18 | for(int i = 1;i<=dp[0].size();i++){ 19 | if(pattern[i - 1] == '*') dp[0][i] = dp[0][i-2]; 20 | } 21 | //其他每行 22 | for(int i = 1;i<=rows;i++) 23 | for(int j = 1;j<=cols;j++){ 24 | if(str[i-1] == pattern[j-1] || pattern[j-1] == '.') dp[i][j] = dp[i-1][j-1]; 25 | else if(pattern[j-1] == '*'){ 26 | //如果*表示的字符和当前字符不相等,则*只能是0次 27 | if(pattern[j-2] != str[i-1] && pattern[j-2] != '.') dp[i][j] = dp[i][j-2]; 28 | //如果相等,则可能0次 1次或多次 29 | else dp[i][j] = dp[i][j-2] || dp[i][j-1] || dp[i-1][j]; 30 | } 31 | } 32 | return dp[rows][cols]; 33 | } 34 | }; -------------------------------------------------------------------------------- /sword2offer/59.Print.cpp: -------------------------------------------------------------------------------- 1 | //按之字形顺序打印二叉树 2 | //https://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0 3 | class Solution { 4 | public: 5 | vector > Print(TreeNode* pRoot) { 6 | vector > result; 7 | if(pRoot == NULL) return result; 8 | stack s1,s2; 9 | s1.push(pRoot); 10 | TreeNode* last = pRoot; 11 | while(!s1.empty() || !s2.empty()){ 12 | vector line; 13 | while(!s1.empty()){ 14 | TreeNode* pNode = s1.top(); 15 | s1.pop(); 16 | line.push_back(pNode->val); 17 | if(pNode->left) 18 | s2.push(pNode->left); 19 | if(pNode->right) 20 | s2.push(pNode->right); 21 | } 22 | if(line.size() > 0) result.push_back(line); 23 | line.resize(0); 24 | while(!s2.empty()){ 25 | TreeNode* pNode = s2.top(); 26 | s2.pop(); 27 | line.push_back(pNode->val); 28 | if(pNode->right) 29 | s1.push(pNode->right); 30 | if(pNode->left) 31 | s1.push(pNode->left); 32 | } 33 | if(line.size() > 0) result.push_back(line); 34 | } 35 | return result; 36 | } 37 | 38 | }; -------------------------------------------------------------------------------- /sword2offer/31.NumberOf1Between1AndN_Solution.cpp: -------------------------------------------------------------------------------- 1 | //整数中1出现的次数(从1到n整数中1出现的次数) 2 | //https://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6 3 | class Solution { 4 | public: 5 | int NumberOf1Between1AndN_Solution(int n) 6 | { 7 | char strN[20]; 8 | sprintf(strN,"%d",n); 9 | return NumberOf1Between1AndN_Solution(strN); 10 | } 11 | 12 | int NumberOf1Between1AndN_Solution(const char* strN){ 13 | if(strN == NULL || *strN < '0' || *strN > '9' || *strN == '\0') 14 | return 0; 15 | //假如传入34512 16 | int len = strlen(strN); 17 | int first = *strN - '0'; 18 | if(len == 1 && first == 0) return 0; 19 | int numberOfFirst = 0; 20 | if(first > 1) 21 | //34512 有 10000个1 22 | numberOfFirst = pow(10,len-1); 23 | else if(first == 1) 24 | //14512 只有4513个1 25 | numberOfFirst = atoi(strN+1)+1; 26 | //4513 - 34512 除了第一位以外的1的个数 27 | //总共30000个数 对于后4位 固定1位 有1000个1 有4中固定方法 28 | int numberOfOther = 0; 29 | if(len >= 2) 30 | numberOfOther = first * (len-1) * pow(10,(len-2)); 31 | else 32 | numberOfOther = first * (len-1); 33 | int numberRecursive = NumberOf1Between1AndN_Solution(strN+1); 34 | return numberOfFirst + numberOfOther+numberRecursive; 35 | } 36 | }; -------------------------------------------------------------------------------- /toutiao-8537209/3.maxSameString.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | using namespace std; 9 | 10 | //在count里 从i到j变为连续 需要的最小操作次数 11 | int getMinSum(int i, int j, int* count) { 12 | //相等 返回0 13 | if (i == j) 14 | return 0; 15 | //相邻 返回对应出现位置之差 16 | if (i == j - 1) 17 | return count[j] - count[i] - 1; 18 | else 19 | //其他,得到i+1,j-1需要的最少次数 20 | //加上使count[j]和count[i]连续需要的次数 21 | //(count[j] - count[i]) - (j - i) 说明:(count[j] - count[i])-1 表示将i j相邻需要的移动次数 22 | //事实上他们需要相隔 j-i-1个元素 所以最终结果是(count[j] - count[i])-1-(j-i-1) 23 | return getMinSum(i + 1, j - 1, count) + (count[j] - count[i]) - (j - i); 24 | } 25 | 26 | int main() 27 | { 28 | string s; 29 | int num; 30 | cin >> s >> num; 31 | map> mapCount; 32 | for (size_t i = 0; i < s.length(); i++) 33 | { 34 | mapCount[s[i]].push_back(i); 35 | } 36 | int result = 1; 37 | for (auto& it : mapCount) { 38 | int n = it.second.size(); 39 | //只出现了一次 不需要计算 40 | if (n <= 1) continue; 41 | for (int i = 0; i < n; i++) 42 | { 43 | for (int j = i+1; j < n; j++) 44 | { 45 | if (getMinSum(i,j,&it.second[0]) <= num) 46 | { 47 | result = max(result, j - i + 1); 48 | } 49 | } 50 | } 51 | } 52 | cout << (s.length() == 0 ? 0 : result) << endl; 53 | return 0; 54 | } 55 | -------------------------------------------------------------------------------- /iqiyi-8246879/3.bubbleSort.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | using namespace std; 7 | 8 | //得到所有下标大于等于x的数贡献的逆序数 9 | int getReverseNumber(vector& A, int x) 10 | { 11 | int cnt = 0; 12 | for (int i = x; i < A.size(); i++) 13 | { 14 | for (int j = 0; j < i; j++) 15 | { 16 | if (A[j] > A[i]) cnt++; 17 | } 18 | } 19 | return cnt; 20 | } 21 | 22 | int main() 23 | { 24 | int n, K; 25 | cin >> n >> K; 26 | vector A(n); 27 | for (int i = 0; i < n; i++) 28 | { 29 | cin >> A[i]; 30 | } 31 | vector> dp(n + 1, vector(K + 1, 0)); 32 | for (int i = n - 1; i >= 0; i--) 33 | { 34 | for (int k = 0; k <= K; k++) 35 | { 36 | vector B1(A.begin(), A.begin() + i + 1); 37 | dp[i][k] = getReverseNumber(B1, i) + dp[i + 1][k]; 38 | if (k > 0) { 39 | for (int l = i+1; l < n; l++) 40 | { 41 | vector B2(A.begin(), A.begin() + l + 1); 42 | reverse(B2.begin() + i, B2.begin() + l + 1); 43 | dp[i][k] = min(dp[i][k], getReverseNumber(B2, i) + dp[l + 1][k - 1]); 44 | } 45 | } 46 | } 47 | } 48 | cout << dp[0][K] << endl; 49 | return 0; 50 | } -------------------------------------------------------------------------------- /toutiao-8537209/1.favourite.cpp: -------------------------------------------------------------------------------- 1 | //编程题1 用户喜好 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | using namespace std; 10 | 11 | int main() 12 | { 13 | int n; 14 | cin >> n; 15 | vector user(n); 16 | map> dp; 17 | for (size_t i = 0; i < n; i++) 18 | { 19 | cin >> user[i]; 20 | dp[user[i]].push_back(i); 21 | } 22 | int q; 23 | cin >> q; 24 | while (q--) 25 | { 26 | int l, r, k; 27 | cin >> l >> r >> k; 28 | l--; 29 | r--; 30 | if (dp.count(k) == 0) 31 | cout << 0 << endl; 32 | else 33 | { 34 | //第一个大于等于l出现的位置 35 | auto l1 = std::lower_bound(dp[k].begin(), dp[k].end(), l); 36 | if (l1 == dp[k].end() || *l1 > r) 37 | { 38 | cout << 0 << endl; 39 | continue; 40 | } 41 | //第一个大于等于r出现的位置 42 | auto l2 = std::lower_bound(dp[k].begin(), dp[k].end(), r); 43 | if (l2 == dp[k].end()) 44 | { 45 | cout << dp[k].size() - (l1 - dp[k].begin()) << endl; 46 | continue; 47 | } 48 | cout << (l2 - dp[k].begin()) - (l1 - dp[k].begin()) + ((*l2 == r) ? 1 : 0) << endl; 49 | } 50 | } 51 | return 0; 52 | } 53 | -------------------------------------------------------------------------------- /wangyi-6910869/4.magicCountry.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | using namespace std; 8 | vector> vecListPath; 9 | 10 | void dfs(int i, vector& len,int depth) 11 | { 12 | if (vecListPath[i].size() == 0) 13 | { 14 | len.push_back(depth); 15 | return; 16 | } 17 | for (auto& it : vecListPath[i]) { 18 | dfs(it, len, depth + 1); 19 | } 20 | } 21 | 22 | 23 | int main() 24 | { 25 | int n, L; 26 | cin >> n >> L; 27 | vecListPath.resize(n, list()); 28 | for (size_t i = 1; i < n; i++) 29 | { 30 | int t; 31 | cin >> t; 32 | vecListPath[t].push_back(i); 33 | } 34 | //0开始 dfs 35 | vector lens; 36 | dfs(0, lens, 0); 37 | sort(lens.begin(), lens.end(),greater()); 38 | if (L <= lens[0]) 39 | { 40 | cout << L + 1 << endl; 41 | } 42 | else { 43 | int total = lens[0]; 44 | L -= lens[0]; 45 | int sumlen = 0; 46 | std::for_each(lens.begin(), lens.end(), [&](int x) { sumlen += x; }); 47 | sumlen -= lens[0]; 48 | if (L > sumlen * 2) 49 | { 50 | cout << lens[0] + sumlen + 1 << endl; 51 | } 52 | else { 53 | cout << lens[0] + L / 2 + 1 << endl; 54 | } 55 | } 56 | return 0; 57 | } -------------------------------------------------------------------------------- /iqiyi-8246859/ReadMe.md: -------------------------------------------------------------------------------- 1 | [爱奇艺2018秋季校招算法工程师(第二场)](https://www.nowcoder.com/test/8246859/summary) 2 | ==================== 3 | 4 | + 编程题1 青草游戏 5 | 6 | 牛牛和羊羊都很喜欢青草。今天他们决定玩青草游戏。 7 | 最初有一个装有n份青草的箱子,牛牛和羊羊依次进行,牛牛先开始。在每个回合中,每个玩家必须吃一些箱子中的青草,所吃的青草份数必须是4的x次幂,比如1,4,16,64等等。不能在箱子中吃到有效份数青草的玩家落败。假定牛牛和羊羊都是按照最佳方法进行游戏,请输出胜利者的名字。 8 | 输入描述: 9 | 输入包括t+1行。 10 | 第一行包括一个整数t(1 ≤ t ≤ 100),表示情况数. 11 | 接下来t行每行一个n(1 ≤ n ≤ 10^9),表示青草份数 12 | 13 | 14 | 输出描述: 15 | 对于每一个n,如果牛牛胜利输出"niu",如果羊羊胜利输出"yang"。 16 | 示例1 17 | 输入 18 | 3 19 | 1 20 | 2 21 | 3 22 | 输出 23 | niu 24 | yang 25 | niu 26 | 27 | + 编程题2 无聊的牛牛和羊羊 28 | 29 | 牛牛和羊羊非常无聊.他们有n + m个共同朋友,他们中有n个是无聊的,m个是不无聊的。每个小时牛牛和羊羊随机选择两个不同的朋友A和B.(如果存在多种可能的pair(A, B),任意一个被选到的概率相同。),然后牛牛会和朋友A进行交谈,羊羊会和朋友B进行交谈。在交谈之后,如果被选择的朋友之前不是无聊会变得无聊。现在你需要计算让所有朋友变得无聊所需要的时间的期望值。 30 | 输入描述: 31 | 输入包括两个整数n 和 m(1 ≤ n, m ≤ 50) 32 | 33 | 34 | 输出描述: 35 | 输出一个实数,表示需要时间的期望值,四舍五入保留一位小数。 36 | 示例1 37 | 输入 38 | 2 1 39 | 输出 40 | 1.5 41 | 42 | + 编程题3 幸运子序列 43 | 44 | 牛牛得到一个长度为n的整数序列V,牛牛定义一段连续子序列的幸运值为这段子序列中最大值和次大值的异或值(次大值是严格的次大)。牛牛现在需要求出序列V的所有连续子序列中幸运值最大是多少。请你帮帮牛牛吧。 45 | 输入描述: 46 | 第一行一个整数n,即序列的长度。(2<= n <= 100000) 47 | 第二行n个数,依次表示这个序列每个数值V[i], (1 ≤ V[i] ≤ 10^8)且保证V[1]到V[n]中至少存在不同的两个值. 48 | 49 | 50 | 输出描述: 51 | 输出一个整数,即最大的幸运值 52 | 示例1 53 | 输入 54 | 5 55 | 5 2 1 4 3 56 | 输出 57 | 7 58 | -------------------------------------------------------------------------------- /leetcode/13.copyRandomList.cpp: -------------------------------------------------------------------------------- 1 | //copy-list-with-random-pointer 2 | //https://www.nowcoder.com/practice/60e43001345241ba9266cb4ee6fc6350 3 | class Solution { 4 | public: 5 | RandomListNode *copyRandomList(RandomListNode *head) { 6 | CloneNode(head); 7 | CloneRandomNode(head); 8 | return SplitList(head); 9 | } 10 | 11 | void CloneNode(RandomListNode* head){ 12 | while(head){ 13 | RandomListNode* newNode = new RandomListNode(head->label); 14 | newNode->next = head->next; 15 | head->next = newNode; 16 | head = newNode->next; 17 | } 18 | } 19 | 20 | void CloneRandomNode(RandomListNode* head){ 21 | while(head){ 22 | RandomListNode* nextNode = head->next; 23 | nextNode->random = head->random?head->random->next:NULL; 24 | head = nextNode->next; 25 | } 26 | } 27 | RandomListNode* SplitList(RandomListNode* head){ 28 | if(head == NULL) return NULL; 29 | RandomListNode* newHead = head->next; 30 | head->next = newHead->next; 31 | head = head->next; 32 | RandomListNode* newNode = newHead; 33 | while(head){ 34 | newNode->next = head->next; 35 | newNode = newNode->next; 36 | head->next = newNode->next; 37 | head = head->next; 38 | } 39 | return newHead; 40 | } 41 | }; -------------------------------------------------------------------------------- /meituan-5583018/ReadMe.md: -------------------------------------------------------------------------------- 1 | [美团点评2017秋招笔试编程题](https://www.nowcoder.com/test/5583018/summary) 2 | ==================== 3 | 4 | + 编程题1 大富翁游戏 5 | 6 | 大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步。求玩家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法。 7 | 输入描述: 8 | 输入包括一个整数n,(1 ≤ n ≤ 6) 9 | 10 | 11 | 输出描述: 12 | 输出一个整数,表示投骰子的方法 13 | 14 | 输入例子1: 15 | 6 16 | 17 | 输出例子1: 18 | 32 19 | 20 | + 编程题2 拼凑钱币 21 | 22 | 给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。 23 | 输入描述: 24 | 输入包括一个整数n(1 ≤ n ≤ 10000) 25 | 26 | 27 | 输出描述: 28 | 输出一个整数,表示不同的组合方案数 29 | 30 | 输入例子1: 31 | 1 32 | 33 | 输出例子1: 34 | 1 35 | 36 | + 编程题3 最大矩形面积 37 | 38 | 给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 39 | 40 | ![](https://github.com/reyzalx/nowcoder/raw/master/resources/5583018-1.png) 41 | 42 | 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。 43 | 44 | 45 | 输入描述: 46 | 输入包括两行,第一行包含一个整数n(1 ≤ n ≤ 10000) 47 | 第二行包括n个整数,表示h数组中的每个值,h_i(1 ≤ h_i ≤ 1,000,000) 48 | 49 | 50 | 输出描述: 51 | 输出一个整数,表示最大的矩阵面积。 52 | 53 | 输入例子1: 54 | 6 55 | 2 1 5 6 2 3 56 | 57 | 输出例子1: 58 | 10 59 | 60 | + 编程题4 最长公共连续子串 61 | 62 | 给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。 63 | 输入描述: 64 | 输入为两行字符串(可能包含空格),长度均小于等于50. 65 | 66 | 67 | 输出描述: 68 | 输出为一个整数,表示最长公共连续子串的长度。 69 | 70 | 输入例子1: 71 | abcde 72 | abgde 73 | 74 | 输出例子1: 75 | 2 -------------------------------------------------------------------------------- /sword2offer/25.Clone.cpp: -------------------------------------------------------------------------------- 1 | //复杂链表的复制 2 | //https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba 3 | class Solution { 4 | public: 5 | RandomListNode* Clone(RandomListNode* pHead) 6 | { 7 | CloneNode(pHead); 8 | MoveRandomNode(pHead); 9 | return SplitList(pHead); 10 | } 11 | 12 | void CloneNode(RandomListNode* pHead) 13 | { 14 | while(pHead){ 15 | RandomListNode* pNode = new RandomListNode(pHead->label); 16 | pNode->next = pHead->next; 17 | pHead->next = pNode; 18 | pHead = pNode->next; 19 | } 20 | } 21 | 22 | void MoveRandomNode(RandomListNode* pHead) 23 | { 24 | while(pHead){ 25 | RandomListNode* pNode = pHead->next; 26 | pNode->random = pHead->random ? pHead->random->next:NULL; 27 | pHead = pNode->next; 28 | } 29 | } 30 | 31 | RandomListNode* SplitList(RandomListNode* pHead) 32 | { 33 | if(pHead == NULL) return NULL; 34 | RandomListNode* pNewHead = pHead->next; 35 | pHead->next = pNewHead->next; 36 | pHead = pHead->next; 37 | RandomListNode* pNewNode = pNewHead; 38 | while(pHead){ 39 | pNewNode->next = pHead->next; 40 | pNewNode = pNewNode->next; 41 | pHead->next = pNewNode->next; 42 | pHead = pHead->next; 43 | } 44 | return pNewHead; 45 | } 46 | }; -------------------------------------------------------------------------------- /leetcode/11.wordBreak2.cpp: -------------------------------------------------------------------------------- 1 | //word-break-ii 2 | //https://www.nowcoder.com/practice/bd73f6b52fdc421d91b14f9c909f9104 3 | class Solution { 4 | public: 5 | map> mapResult; 6 | //在牛客网无法AC,因为输出结果的顺序和它题目的顺序不一致,在Leetcode网可以AC 7 | vector wordBreak(string s, unordered_set &dict) { 8 | vector result; 9 | dfs(s, dict, result); 10 | return result; 11 | } 12 | 13 | void dfs(string s, unordered_set& dict, vector& result) 14 | { 15 | if (s == "") { 16 | result.push_back(""); 17 | return; 18 | } 19 | if (mapResult.count(s) > 0) { 20 | result = mapResult[s]; 21 | return; 22 | } 23 | for (int i = 0; i < s.length(); i++) 24 | { 25 | string sub = s.substr(0, i + 1); 26 | if (dict.count(sub) == 0) 27 | continue; 28 | vector rightList; 29 | dfs(s.substr(i + 1), dict, rightList); 30 | if (rightList.size() == 0) 31 | continue; 32 | for (auto& it : rightList) { 33 | string tmp; 34 | tmp.append(sub); 35 | if(it.length() > 0) 36 | tmp.append(" "); 37 | tmp.append(it); 38 | result.insert(result.begin(),tmp); 39 | } 40 | } 41 | mapResult[s] = result; 42 | } 43 | }; -------------------------------------------------------------------------------- /sword2offer/35.InversePairs.cpp: -------------------------------------------------------------------------------- 1 | //数组中的逆序对 2 | //https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5 3 | class Solution { 4 | public: 5 | int InversePairs(vector data) { 6 | if(data.size() == 0) return 0; 7 | int result = 0; 8 | int * temp = new int[data.size()]; 9 | MergeSort(&data[0],0,data.size()-1,temp,result); 10 | delete temp; 11 | return result; 12 | } 13 | 14 | void MergeSort(int* data,int l,int r,int* temp,int& result){ 15 | if(l < r){ 16 | int mid = l + (r-l)/2; 17 | MergeSort(data,l,mid,temp,result); 18 | MergeSort(data,mid+1,r,temp,result); 19 | MergeArray(data,l,mid,r,temp,result); 20 | } 21 | } 22 | void MergeArray(int* data,int l,int mid,int r,int* temp,int& result){ 23 | int i = l; 24 | int j = mid+1; 25 | int k = 0; 26 | while(i <= mid && j <= r){ 27 | if(data[i] < data[j]){ 28 | temp[k++] = data[i++]; 29 | }else{ 30 | //左边有多少就加多少个逆序对 31 | result += mid - i + 1; 32 | temp[k++] = data[j++]; 33 | result = result % 1000000007; 34 | } 35 | } 36 | while(i <= mid) 37 | temp[k++] = data[i++]; 38 | while(j <= r) 39 | temp[k++] = data[j++]; 40 | for(i = 0;i 2 | 3 | using namespace std; 4 | 5 | 6 | //代码写的有点绕,基本思想就是将工作和能力都排序,然后都从小开始遍历 7 | //复杂度max(NlogN,MlogM,N+M) 8 | int main() 9 | { 10 | int N, M; 11 | cin >> N >> M; 12 | vector> job(N); 13 | for (int i = 0; i < N; i++) 14 | { 15 | cin >> job[i].first >> job[i].second; 16 | } 17 | vector> friends(M); 18 | vector earn(M, 0); 19 | for (int i = 0; i < M; i++) 20 | { 21 | cin >> friends[i].first; 22 | friends[i].second = i; 23 | } 24 | sort(friends.begin(), friends.end(), [&](pair &e1, pair& e2) {return e1.first < e2.first; }); 25 | sort(job.begin(), job.end(), [&](pair &e1, pair& e2) {return e1.first < e2.first; }); 26 | 27 | int indexFriend = 0; 28 | int indexJob = 0; 29 | int preEarn = 0; 30 | while (indexFriend < M && indexJob < N) 31 | { 32 | if (friends[indexFriend].first < job[indexJob].first) 33 | indexFriend++; 34 | else if (indexJob == N-1 || friends[indexFriend].first < job[indexJob + 1].first) { 35 | preEarn = earn[friends[indexFriend].second] = max(preEarn, job[indexJob].second); 36 | indexFriend++; 37 | } 38 | else { 39 | preEarn = max(preEarn, job[indexJob].second); 40 | indexJob++; 41 | } 42 | } 43 | for (int i = 0; i < M; i++) 44 | { 45 | cout << earn[i] << endl; 46 | } 47 | return 0; 48 | } -------------------------------------------------------------------------------- /wangyi-4575457/5.magicRing.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | void multipy(vector>& mat1, vector> mat2) 6 | { 7 | vector> tmp(mat1); 8 | for (int i = 0; i < mat1.size(); i++) 9 | { 10 | for (int j = 0; j < mat2.size(); j++) 11 | { 12 | mat1[i][j] = 0; 13 | for (int k = 0; k < mat1.size(); k++) 14 | { 15 | mat1[i][j] += tmp[i][k] * mat2[k][j]; 16 | } 17 | mat1[i][j] %= 100; 18 | } 19 | } 20 | } 21 | 22 | void calc(vector>& mat,int k) 23 | { 24 | vector> res(mat.size(), vector(mat.size(), 0)); 25 | for (int i = 0; i < res.size(); i++) 26 | { 27 | res[i][i] = 1; 28 | } 29 | while (k) 30 | { 31 | if (k & 1) { 32 | multipy(res, mat); 33 | } 34 | k >>= 1; 35 | if(k) multipy(mat, mat); 36 | } 37 | mat = res; 38 | } 39 | 40 | 41 | /* 42 | 假设n=3 颜色矩阵B 43 | 1 0 1 44 | 1 1 0 45 | 0 1 1 46 | 结果就是 B*(A^k) 核心就是求矩阵的k次幂 47 | */ 48 | int main() 49 | { 50 | int n, k; 51 | cin >> n >> k; 52 | vector data(n); 53 | vector> mat(n, vector(n, 0)); 54 | for (int i = 0; i < n; i++) 55 | { 56 | cin >> data[i]; 57 | mat[i][i] = 1; 58 | if (i + 1 == n) 59 | mat[0][i] = 1; 60 | else 61 | mat[i+1][i] = 1; 62 | } 63 | //求mat的k次方 64 | calc(mat, k); 65 | vector tmp(data); 66 | for (int i = 0; i < data.size(); i++) 67 | { 68 | data[i] = 0; 69 | for (int j = 0; j < mat.size(); j++) 70 | { 71 | data[i] += tmp[j] * mat[j][i]; 72 | } 73 | cout << data[i] % 100 << (i == data.size() - 1 ? "\n" : " "); 74 | } 75 | return 0; 76 | } -------------------------------------------------------------------------------- /iqiyi-8246915/ReadMe.md: -------------------------------------------------------------------------------- 1 | [爱奇艺2018秋季校招算法工程师(第一场)](https://www.nowcoder.com/test/8246915/summary) 2 | ==================== 3 | 4 | + 编程题1 括号匹配深度 5 | 6 | 一个合法的括号匹配序列有以下定义: 7 | 1、空串""是一个合法的括号匹配序列 8 | 2、如果"X"和"Y"都是合法的括号匹配序列,"XY"也是一个合法的括号匹配序列 9 | 3、如果"X"是一个合法的括号匹配序列,那么"(X)"也是一个合法的括号匹配序列 10 | 4、每个合法的括号序列都可以由以上规则生成。 11 | 例如: "","()","()()","((()))"都是合法的括号序列 12 | 对于一个合法的括号序列我们又有以下定义它的深度: 13 | 1、空串""的深度是0 14 | 2、如果字符串"X"的深度是x,字符串"Y"的深度是y,那么字符串"XY"的深度为max(x,y) 3、如果"X"的深度是x,那么字符串"(X)"的深度是x+1 15 | 例如: "()()()"的深度是1,"((()))"的深度是3。牛牛现在给你一个合法的括号序列,需要你计算出其深度。 16 | 输入描述: 17 | 输入包括一个合法的括号序列s,s长度length(2 ≤ length ≤ 50),序列中只包含'('和')'。 18 | 19 | 20 | 输出描述: 21 | 输出一个正整数,即这个序列的深度。 22 | 23 | 输入例子1: 24 | (()) 25 | 26 | 输出例子1: 27 | 2 28 | 29 | + 编程题2 奶牛编号 30 | 31 | 牛牛养了n只奶牛,牛牛想给每只奶牛编号,这样就可以轻而易举地分辨它们了。 每个奶牛对于数字都有自己的喜好,第i只奶牛想要一个1和x[i]之间的整数(其中包含1和x[i])。 32 | 牛牛需要满足所有奶牛的喜好,请帮助牛牛计算牛牛有多少种给奶牛编号的方法,输出符合要求的编号方法总数。 33 | 输入描述: 34 | 输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),表示奶牛的数量 第二行为n个整数x[i](1 ≤ x[i] ≤ 1000) 35 | 36 | 37 | 输出描述: 38 | 输出一个整数,表示牛牛在满足所有奶牛的喜好上编号的方法数。因为答案可能很大,输出方法数对1,000,000,007的模。 39 | 40 | 输入例子1: 41 | 4 42 | 4 4 4 4 43 | 44 | 输出例子1: 45 | 24 46 | 47 | + 编程题3 平方串 48 | 49 | 如果一个字符串S是由两个字符串T连接而成,即S = T + T, 我们就称S叫做平方串,例如"","aabaab","xxxx"都是平方串. 50 | 牛牛现在有一个字符串s,请你帮助牛牛从s中移除尽量少的字符,让剩下的字符串是一个平方串。换句话说,就是找出s的最长子序列并且这个子序列构成一个平方串。 51 | 输入描述: 52 | 输入一个字符串s,字符串长度length(1 ≤ length ≤ 50),字符串只包括小写字符。 53 | 54 | 55 | 输出描述: 56 | 输出一个正整数,即满足要求的平方串的长度。 57 | 58 | 输入例子1: 59 | frankfurt 60 | 61 | 输出例子1: 62 | 4 63 | -------------------------------------------------------------------------------- /sword2offer/65.hasPath.cpp: -------------------------------------------------------------------------------- 1 | //矩阵中的路径 2 | //https://www.nowcoder.com/practice/c61c6999eecb4b8f88a98f66b273a3cc 3 | class Solution 4 | { 5 | public: 6 | bool dfs(int i,int j,int strindex) 7 | { 8 | if (visited[i][j]) 9 | { 10 | return false; 11 | } 12 | static int dir[][2] = 13 | { 14 | { 0, 1 }, 15 | { 1, 0 }, 16 | { 0, -1 }, 17 | { -1, 0 }, 18 | }; 19 | if (matrix_[i*cols_ + j] == str_[strindex]) 20 | { 21 | if (++strindex == lenstr) 22 | { 23 | return true; 24 | } 25 | } 26 | else { 27 | return false; 28 | } 29 | visited[i][j] = true; 30 | for (int k = 0; k < 4; k++) 31 | { 32 | if (i + dir[k][0] < 0 || i + dir[k][0] >= rows_) 33 | continue; 34 | if (j + dir[k][1] < 0 || j + dir[k][1] >= cols_) 35 | continue; 36 | if (dfs(i + dir[k][0], j + dir[k][1], strindex)) { 37 | return true; 38 | } 39 | } 40 | visited[i][j] = false; 41 | return false; 42 | } 43 | char* str_; 44 | int lenstr; 45 | char* matrix_; 46 | int rows_; 47 | int cols_; 48 | vector> visited; 49 | bool hasPath(char* matrix, int rows, int cols, char* str) 50 | { 51 | if (str == NULL || str[0] == '\0') return true; 52 | if (cols == 0 || rows == 0) return false; 53 | this->str_ = str; 54 | this->matrix_ = matrix; 55 | this->rows_ = rows; 56 | this->cols_ = cols; 57 | lenstr = strlen(str); 58 | visited.resize(rows, vector(cols, false)); 59 | for (int i = 0; i < rows; i++) 60 | for (int j = 0; j < cols; j++) 61 | { 62 | if (dfs(i,j,0)) 63 | { 64 | return true; 65 | } 66 | } 67 | return false; 68 | } 69 | }; -------------------------------------------------------------------------------- /sword2offer/4.reConstructBinaryTree.cpp: -------------------------------------------------------------------------------- 1 | //重建二叉树 2 | //https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6 3 | class Solution { 4 | public: 5 | int error_; 6 | TreeNode* reConstructBinaryTree(vector pre,vector vin) { 7 | if(pre.size() == 0 || vin.size() == 0){ 8 | return NULL; 9 | } 10 | error_ = 0; 11 | return reConstructBinaryTree(&pre[0],&pre[pre.size() - 1],&vin[0],&vin[vin.size() - 1]); 12 | } 13 | 14 | TreeNode* reConstructBinaryTree(int* pre1,int* pre2,int* vin1,int* vin2) { 15 | if(pre1 > pre2){ 16 | return NULL; 17 | } 18 | if(pre2 - pre1 != vin2 - vin1){ 19 | error_ = 1; 20 | return NULL; 21 | } 22 | int root_val = *pre1; 23 | TreeNode* root = new TreeNode(root_val); 24 | int* root_in_vin = vin1; 25 | while(root_in_vin <= vin2){ 26 | if(*root_in_vin == root_val){ 27 | break; 28 | } 29 | root_in_vin ++; 30 | } 31 | if(root_in_vin > vin2){ 32 | error_ = 1; 33 | return NULL; 34 | } 35 | int* left_pre1 = pre1 + 1; 36 | int* left_pre2 = pre1 + (root_in_vin - vin1); 37 | int* left_vin1 = vin1; 38 | int* left_vin2 = root_in_vin - 1; 39 | int* right_pre1 = left_pre2 + 1; 40 | int* right_pre2 = pre2; 41 | int* right_vin1 = root_in_vin + 1; 42 | int* right_vin2 = vin2; 43 | root->left = reConstructBinaryTree(left_pre1,left_pre2,left_vin1,left_vin2); 44 | root->right = reConstructBinaryTree(right_pre1,right_pre2,right_vin1,right_vin2); 45 | return root; 46 | } 47 | }; -------------------------------------------------------------------------------- /leetcode/8.reorderList.cpp: -------------------------------------------------------------------------------- 1 | //reorder-list 2 | //https://www.nowcoder.com/practice/3d281dc0b3704347846a110bf561ef6b 3 | class Solution { 4 | public: 5 | void reorderList(ListNode *head) { 6 | int len = getListLength(head); 7 | if(len <= 2) return; 8 | ListNode* listLeft = head; 9 | ListNode* listRight = reverseList(getKthNode(head,len/2)); 10 | //合并链表 11 | ListNode* pNewHead = listLeft; 12 | listLeft = listLeft->next; 13 | while(listLeft&&listRight){ 14 | pNewHead->next = listRight; 15 | listRight = listRight->next; 16 | pNewHead = pNewHead->next; 17 | pNewHead->next = listLeft; 18 | listLeft = listLeft->next; 19 | pNewHead = pNewHead->next; 20 | } 21 | if(listLeft) 22 | pNewHead->next = listLeft; 23 | if(listRight) 24 | pNewHead->next = listRight; 25 | } 26 | 27 | int getListLength(ListNode* head){ 28 | int len = 0; 29 | while(head){ 30 | len++; 31 | head = head->next; 32 | } 33 | return len; 34 | } 35 | //得到第k个节点 36 | ListNode* getKthNode(ListNode* head,int k){ 37 | ListNode* pre = head; 38 | for(int i = 0;inext; 41 | } 42 | //k-1节点截断 43 | pre->next = NULL; 44 | return head; 45 | } 46 | 47 | //逆序链表 48 | ListNode* reverseList(ListNode* head){ 49 | if(head == NULL || head->next == NULL) return head; 50 | ListNode* pNewHead = reverseList(head->next); 51 | head->next->next = head; 52 | head->next = NULL; 53 | return pNewHead; 54 | } 55 | }; -------------------------------------------------------------------------------- /nowcoder-9439037/6.braveCow.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | int result = 0; 5 | int n, K; 6 | int best[32] = { 0 }; 7 | 8 | void dfs(int cur,int flag,int sum) { 9 | if (cur == K) 10 | { 11 | result = max(result,sum); 12 | return; 13 | } 14 | for (int i = 0; i < 32; i++) 15 | { 16 | if (i & flag) 17 | continue; 18 | dfs(cur + 1, i | flag, sum + best[i]); 19 | } 20 | } 21 | int main() 22 | { 23 | cin >> n >> K; 24 | vector> data(n, vector(5)); 25 | int maxv[5] = { 0 }; 26 | for (int i = 0; i < n; i++) 27 | { 28 | cin >> data[i][0] >> data[i][1] >> data[i][2] >> data[i][3] >> data[i][4]; 29 | for (int k = 0; k < 5; k++) 30 | { 31 | maxv[k] = max(maxv[k], data[i][k]); 32 | } 33 | //这里是计算当使用当前装备第12345个属性时,加成是多少 34 | //best记录最大加成 35 | //11111 表示使用装备5个属性 36 | //11110 使用装备第1234属性 11101 使用装备第1235属性 类推 37 | for (int j = 1; j < 32; j++) 38 | { 39 | int temp = 0; 40 | for (int k = 0; k < 5; k++) 41 | { 42 | if (j&(1 << k)) { 43 | temp += data[i][k]; 44 | } 45 | } 46 | best[j] = max(best[j], temp); 47 | } 48 | } 49 | if (K >= 5) 50 | { 51 | //大于5肯定单属性最高的 52 | for (int i = 0; i < 5; i++) 53 | { 54 | result += maxv[i]; 55 | } 56 | } 57 | else { 58 | //小于5 59 | //选单件5个属性的 60 | //选单件4个属性的,下一件是1个属性 61 | //选单件3个属性的,下一件可以2个属性或者1个属性 62 | //...可以动态规划,小规模直接dfs就行了 63 | dfs(0, 0,0); 64 | } 65 | cout << result << endl; 66 | return 0; 67 | } -------------------------------------------------------------------------------- /toutiao-8537039/ReadMe.md: -------------------------------------------------------------------------------- 1 | [今日头条2018校招后端方向(第四批)](https://www.nowcoder.com/test/8537039/summary) 2 | ==================== 3 | 4 | + 编程题1 5 | ``` 6 | 有三只球队,每只球队编号分别为球队1,球队2,球队3,这三只球队一共需要进行 n 场比赛。现在已经踢完了k场比赛,每场比赛不能打平,踢赢一场比赛得一分,输了不得分不减分。已知球队1和球队2的比分相差d1分,球队2和球队3的比分相差d2分,每场比赛可以任意选择两只队伍进行。求如果打完最后的 (n-k) 场比赛,有没有可能三只球队的分数打平。 7 | 输入描述: 8 | 第一行包含一个数字 t (1 <= t <= 10) 9 | 接下来的t行每行包括四个数字 n, k, d1, d2(1 <= n <= 10^12; 0 <= k <= n, 0 <= d1, d2 <= k) 10 | 11 | 12 | 输出描述: 13 | 每行的比分数据,最终三只球队若能够打平,则输出“yes”,否则输出“no” 14 | 15 | 输入例子1: 16 | 2 17 | 3 3 0 0 18 | 3 3 3 3 19 | 20 | 输出例子1: 21 | yes 22 | no 23 | 24 | 例子说明1: 25 | case1: 球队1和球队2 差0分,球队2 和球队3也差0分,所以可能的赛得分是三只球队各得1分 26 | case2: 球队1和球队2差3分,球队2和球队3差3分,所以可能的得分是 球队1得0分,球队2得3分, 球队3 得0分,比赛已经全部结束因此最终不能打平。 27 | ``` 28 | + 编程题2 29 | ``` 30 | 有一个仅包含’a’和’b’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’a’设置为’b’,或者把一个’b’置成’a’);但是操作的次数有上限m,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。 31 | 输入描述: 32 | 第一行两个整数 n , m (1<=m<=n<=50000),第二行为长度为n且只包含’a’和’b’的字符串s。 33 | 34 | 35 | 输出描述: 36 | 输出在操作次数不超过 m 的情况下,能够得到的 最大连续 全’a’子串或全’b’子串的长度。 37 | 38 | 输入例子1: 39 | 8 1 40 | aabaabaa 41 | 42 | 输出例子1: 43 | 5 44 | 45 | 例子说明1: 46 | 把第一个 'b' 或者第二个 'b' 置成 'a',可得到长度为 5 的全 'a' 子串。 47 | ``` 48 | + 附加题 49 | ``` 50 | 存在n+1个房间,每个房间依次为房间1 2 3...i,每个房间都存在一个传送门,i房间的传送门可以把人传送到房间pi(1<=pi<=i),现在路人甲从房间1开始出发(当前房间1即第一次访问),每次移动他有两种移动策略: 51 | A. 如果访问过当前房间 i 偶数次,那么下一次移动到房间i+1; 52 | B. 如果访问过当前房间 i 奇数次,那么移动到房间pi; 53 | 现在路人甲想知道移动到房间n+1一共需要多少次移动; 54 | 55 | 输入描述: 56 | 第一行包括一个数字n(30%数据1<=n<=100,100%数据 1<=n<=1000),表示房间的数量,接下来一行存在n个数字 pi(1<=pi<=i), pi表示从房间i可以传送到房间pi。 57 | 58 | 59 | 输出描述: 60 | 输出一行数字,表示最终移动的次数,最终结果需要对1000000007 (10e9 + 7) 取模。 61 | 62 | 输入例子1: 63 | 2 64 | 1 2 65 | 66 | 输出例子1: 67 | 4 68 | 69 | 例子说明1: 70 | 开始从房间1 只访问一次所以只能跳到p1即 房间1, 之后采用策略A跳到房间2,房间2这时访问了一次因此采用策略B跳到房间2,之后采用策略A跳到房间3,因此到达房间3需要 4 步操作。 71 | ``` -------------------------------------------------------------------------------- /wangyi-2385858/ReadMe.md: -------------------------------------------------------------------------------- 1 | [网易有道2017内推编程题](https://www.nowcoder.com/test/2385858/summary) 2 | ==================== 3 | 4 | + 编程题1 洗牌 5 | 6 | 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张。首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆)。接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的倒数第二张牌,直到最后放下左手的第一张牌。接着把牌合并起来就可以了。 例如有6张牌,最开始牌的序列是1,2,3,4,5,6。首先分成两组,左手拿着1,2,3;右手拿着4,5,6。在洗牌过程中按顺序放下了6,3,5,2,4,1。把这六张牌再次合成一组牌之后,我们按照从上往下的顺序看这组牌,就变成了序列1,4,2,5,3,6。 现在给出一个原始牌组,请输出这副牌洗牌k次之后从上往下的序列。 7 | 输入描述: 8 | 第一行一个数T(T ≤ 100),表示数据组数。对于每组数据,第一行两个数n,k(1 ≤ n,k ≤ 100),接下来一行有2n个数a1,a2,...,a2n(1 ≤ ai ≤ 1000000000)。表示原始牌组从上到下的序列。 9 | 10 | 11 | 输出描述: 12 | 对于每组数据,输出一行,最终的序列。数字之间用空格隔开,不要在行末输出多余的空格。 13 | 14 | 输入例子1: 15 | 3 3 1 1 2 3 4 5 6 3 2 1 2 3 4 5 6 2 2 1 1 1 1 16 | 17 | 输出例子1: 18 | 1 4 2 5 3 6 1 5 4 3 2 6 1 1 1 1 19 | 20 | + 编程题2 构造序列 21 | 22 | 小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序: 23 | while(!Q.empty()) //队列不空,执行循环 24 | 25 | { 26 | 27 | int x=Q.front(); //取出当前队头的值x 28 | 29 | Q.pop(); //弹出当前队头 30 | 31 | Q.push(x); //把x放入队尾 32 | 33 | x = Q.front(); //取出这时候队头的值 34 | 35 | printf("%d\n",x); //输出x 36 | 37 | Q.pop(); //弹出这时候的队头 38 | 39 | } 40 | 41 | 做取出队头的值操作的时候,并不弹出当前队头。 42 | 小明同学发现,这段程序恰好按顺序输出了1,2,3,...,n。现在小明想让你构造出原始的队列,你能做到吗?[注:原题样例第三行5有错,应该为3,以下已修正] 43 | 输入描述: 44 | 第一行一个整数T(T ≤ 100)表示数据组数,每组数据输入一个数n(1 ≤ n ≤ 100000),输入的所有n之和不超过200000。 45 | 46 | 47 | 输出描述: 48 | 对于每组数据,输出一行,表示原始的队列。数字之间用一个空格隔开,不要在行末输出多余的空格. 49 | 50 | 输入例子1: 51 | 4 52 | 1 53 | 2 54 | 3 55 | 10 56 | 57 | 输出例子1: 58 | 1 59 | 2 1 60 | 2 1 3 61 | 8 1 6 2 10 3 7 4 9 5 -------------------------------------------------------------------------------- /iqiyi-8246879/ReadMe.md: -------------------------------------------------------------------------------- 1 | [爱奇艺2018秋季校招算法工程师(第三场)](https://www.nowcoder.com/test/8246879/summary) 2 | ==================== 3 | 4 | + 编程题1 缺失的括号 5 | 6 | 一个完整的括号字符串定义规则如下: 7 | 1、空字符串是完整的。 8 | 2、如果s是完整的字符串,那么(s)也是完整的。 9 | 3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。 10 | 例如,"(()())", ""和"(())()"是完整的括号字符串,"())(", "()(" 和 ")"是不完整的括号字符串。 11 | 牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问牛牛至少需要添加多少个括号。 12 | 输入描述: 13 | 输入包括一行,一个括号序列s,序列长度length(1 ≤ length ≤ 50). 14 | s中每个字符都是左括号或者右括号,即'('或者')'. 15 | 16 | 17 | 输出描述: 18 | 输出一个整数,表示最少需要添加的括号数 19 | 20 | 输入例子1: 21 | (()(() 22 | 23 | 输出例子1: 24 | 2 25 | 26 | + 编程题2 最后一位 27 | 28 | 牛牛选择了一个正整数X,然后把它写在黑板上。然后每一天他会擦掉当前数字的最后一位,直到他擦掉所有数位。 在整个过程中,牛牛会把所有在黑板上出现过的数字记录下来,然后求出他们的总和sum. 29 | 例如X = 509, 在黑板上出现过的数字依次是509, 50, 5, 他们的和就是564. 30 | 牛牛现在给出一个sum,牛牛想让你求出一个正整数X经过上述过程的结果是sum. 31 | 输入描述: 32 | 输入包括正整数sum(1 ≤ sum ≤ 10^18) 33 | 34 | 35 | 输出描述: 36 | 输出一个正整数,即满足条件的X,如果没有这样的X,输出-1。 37 | 38 | 输入例子1: 39 | 564 40 | 41 | 输出例子1: 42 | 509 43 | 44 | + 编程题3 冒泡排序 45 | 46 | 牛牛学习了冒泡排序,并写下以下冒泡排序的伪代码,注意牛牛排序的数组a是从下标0开始的。 47 | BubbleSort(a): 48 | Repeat length(a)-1 times: 49 | For every i from 0 to length(a) - 2: 50 | If a[i] > a[i+1] then: 51 | Swap a[i] and a[i+1] 52 | 牛牛现在要使用上述算法对一个数组A排序。 53 | 在排序前牛牛允许执行最多k次特定操作(可以不使用完),每次特定操作选择一个连续子数组,然后对其进行翻转,并且k次特定操作选择的子数组不相交。 54 | 例如A = {1, 2, 3, 4, 5, 6, 7}, k = 1,如果牛牛选择的子数组是[2,4](注意下标从0开始),那么翻转之后的数组变为A = {1, 2, 5, 4, 3, 6, 7}。 55 | 牛牛知道冒泡排序的效率一定程度上取决于Swap操作次数,牛牛想知道对于一个数组A在进行k次特定操作之后,再进行上述冒泡排序最少的Swap操作次数是多少? 56 | 输入描述: 57 | 输入包括两行,第一行包括两个正整数n和k(2 ≤ n ≤ 50, 1 ≤ k ≤ 50),表示数组的长度和允许最多的特定操作次数。 58 | 第二行n个正整数A[i](1 ≤ A[i] ≤ 1000),表示数组内的元素,以空格分割。 59 | 60 | 61 | 输出描述: 62 | 输出一个整数,表示在执行最多k次特定操作之后,对数组进行上述冒泡排序需要的Swap操作次数。 63 | 64 | 输入例子1: 65 | 3 2 66 | 2 3 1 67 | 68 | 输出例子1: 69 | 1 70 | -------------------------------------------------------------------------------- /tengxun-5582994/ReadMe.md: -------------------------------------------------------------------------------- 1 | [腾讯2017秋招笔试编程题](https://www.nowcoder.com/test/5582994/summary) 2 | ==================== 3 | 4 | + 编程题1 编码 5 | 6 | 假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。 编写一个函数,输入是任意一个编码,输出这个编码对应的Index. 7 | 输入描述: 8 | 输入一个待编码的字符串,字符串长度小于等于100. 9 | 10 | 11 | 输出描述: 12 | 输出这个编码的index 13 | 14 | 输入例子1: 15 | baca 16 | 17 | 输出例子1: 18 | 16331 19 | 20 | + 编程题2 游戏任务标记 21 | 22 | 游戏里面有很多各式各样的任务,其中有一种任务玩家只能做一次,这类任务一共有1024个,任务ID范围[1,1024]。请用32个unsigned int类型来记录着1024个任务是否已经完成。初始状态都是未完成。 输入两个参数,都是任务ID,需要设置第一个ID的任务为已经完成;并检查第二个ID的任务是否已经完成。 输出一个参数,如果第二个ID的任务已经完成输出1,如果未完成输出0。如果第一或第二个ID不在[1,1024]范围,则输出-1。 23 | 输入描述: 24 | 输入包括一行,两个整数表示人物ID. 25 | 26 | 27 | 输出描述: 28 | 输出是否完成 29 | 30 | 输入例子1: 31 | 1024 1024 32 | 33 | 输出例子1: 34 | 1 35 | 36 | + 编程题3 素数对 37 | 38 | 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。 39 | 如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7)) 40 | 输入描述: 41 | 输入包括一个整数n,(3 ≤ n < 1000) 42 | 43 | 44 | 输出描述: 45 | 输出对数 46 | 47 | 输入例子1: 48 | 10 49 | 50 | 输出例子1: 51 | 2 52 | 53 | + 编程题4 geohash编码 54 | 55 | geohash编码:geohash常用于将二维的经纬度转换为字符串,分为两步:第一步是经纬度的二进制编码,第二步是base32转码。 56 | 此题考察纬度的二进制编码:算法对纬度[-90, 90]通过二分法进行无限逼近(取决于所需精度,本题精度为6)。注意,本题进行二分法逼近过程中只采用向下取整来进行二分,针对二分中间值属于右区间。算法举例如下: 针对纬度为80进行二进制编码过程: 57 | 1) 区间[-90, 90]进行二分为[-90, 0),[0, 90],成为左右区间,可以确定80为右区间,标记为1; 58 | 2) 针对上一步的右区间[0, 90]进行二分为[0, 45),[45, 90],可以确定80是右区间,标记为1; 59 | 3) 针对[45, 90]进行二分为[45, 67),[67,90],可以确定80为右区间,标记为1; 60 | 4) 针对[67,90]进行二分为[67, 78),[78,90],可以确定80为右区间,标记为1; 61 | 5) 针对[78, 90]进行二分为[78, 84),[84, 90],可以确定80为左区间,标记为0; 62 | 6) 针对[78, 84)进行二分为[78, 81), [81, 84),可以确定80为左区间,标记为0; 63 | 64 | 输入描述: 65 | 输入包括一个整数n,(-90 ≤ n ≤ 90) 66 | 67 | 68 | 输出描述: 69 | 输出二进制编码 70 | 71 | 输入例子1: 72 | 80 73 | 74 | 输出例子1: 75 | 111100 -------------------------------------------------------------------------------- /tengxun-1725829/3.funnyNumber.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | int N; 10 | while(cin >> N){ 11 | vector data(N); 12 | for (int i = 0; i> data[i]; 14 | } 15 | sort(data.begin(), data.end()); 16 | int nmin = data[0]; 17 | int nmax = data[N - 1]; 18 | if (nmin == nmax) { 19 | cout << N*(N - 1) / 2 << " " << N*(N - 1) / 2 << endl; 20 | } 21 | else { 22 | //差最大的数 mincount*maxcount 23 | int mincount = 0, maxcount = 0; 24 | int sub = 0x7fffffff; 25 | int resmin = 0; 26 | int sameCount = 1; 27 | for (int i = 0; i 0) 29 | { 30 | sub = min(sub, data[i] - data[i - 1]); 31 | if (data[i] == data[i - 1]) 32 | { 33 | sameCount++; 34 | } 35 | else { 36 | if (sameCount > 1) { 37 | resmin += sameCount*(sameCount - 1)/2; 38 | } 39 | sameCount = 1; 40 | } 41 | } 42 | if (data[i] == nmin) 43 | mincount++; 44 | if (data[i] == nmax) 45 | maxcount++; 46 | } 47 | if (sameCount > 1) { 48 | resmin += sameCount*(sameCount - 1)/2; 49 | } 50 | if (resmin == 0) { 51 | for (int i = 1; i < N; i++) { 52 | if (data[i] - data[i - 1] == sub) { 53 | resmin++; 54 | } 55 | } 56 | } 57 | cout << resmin << " " << mincount*maxcount << endl; 58 | } 59 | } 60 | return 0; 61 | } 62 | -------------------------------------------------------------------------------- /wangyi-4111169/ReadMe.md: -------------------------------------------------------------------------------- 1 | [2017网易游戏雷火盘古实习生招聘笔试真题](https://www.nowcoder.com/test/4111169/summary) 2 | ==================== 3 | 4 | + 编程题1 字符串编码 5 | 6 | 给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”。比如字符串AAAABCCDAA会被编码成4A1B2C1D2A。 7 | 输入描述: 8 | 每个测试输入包含1个测试用例 9 | 每个测试用例输入只有一行字符串,字符串只包括大写英文字母,长度不超过10000。 10 | 11 | 12 | 输出描述: 13 | 输出编码后的字符串 14 | 15 | 输入例子1: 16 | AAAABCCDAA 17 | 18 | 输出例子1: 19 | 4A1B2C1D2A 20 | 21 | + 编程题2 最大和 22 | 23 | 在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值 24 | 输入描述: 25 | 每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D : 26 | 3 <= N <= 100 27 | 1 <= D <= N 28 | 接下来有N行,每行N个数字d: 29 | 0 <= d <= 100 30 | 31 | 32 | 输出描述: 33 | 输出一个整数,表示找到的和的最大值 34 | 35 | 输入例子1: 36 | 4 2 37 | 87 98 79 61 38 | 10 27 95 70 39 | 20 64 73 29 40 | 71 65 15 0 41 | 42 | 输出例子1: 43 | 193 44 | 45 | + 编程题3 推箱子 46 | 47 | 大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移动一格,当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。现在告诉你游戏开始是初始的地图布局,请你求出玩家最少需要移动多少步才能够将游戏目标达成。 48 | 输入描述: 49 | 每个测试输入包含1个测试用例 50 | 第一行输入两个数字N,M表示地图的大小。其中0 ...S0. 39 | 40 | 注意不能将箱子推动到'#'上, 也不能将箱子推出边界; 41 | 42 | 现在, 给你游戏的初始样子, 你需要输出最少几步能够完成游戏, 如果不能完成, 则输出-1。 43 | 44 | 45 | 输入描述: 46 | 第一行为2个数字,n, m, 表示游戏盘面大小有n 行m 列(5< n, m < 50); 47 | 后面为n行字符串,每行字符串有m字符, 表示游戏盘面; 48 | 49 | 50 | 输出描述: 51 | 一个数字,表示最少几步能完成游戏,如果不能,输出-1; 52 | 53 | 输入例子1: 54 | 3 6 55 | .S#..E 56 | .#.0.. 57 | ...... 58 | 59 | 输出例子1: 60 | 11 61 | 62 | 例子说明1: 63 | 64 | + 编程题2 65 | 66 | 有n个房间,现在i号房间里的人需要被重新分配,分配的规则是这样的:先让i号房间里的人全都出来,接下来按照 i+1, i+2, i+3, ... 的顺序依此往这些房间里放一个人,n号房间的的下一个房间是1号房间,直到所有的人都被重新分配。 67 | 68 | 现在告诉你分配完后每个房间的人数以及最后一个人被分配的房间号x,你需要求出分配前每个房间的人数。数据保证一定有解,若有多解输出任意一个解。 69 | 70 | 71 | 输入描述: 72 | 第一行两个整数n, x (2<=n<=10^5, 1<=x<=n),代表房间房间数量以及最后一个人被分配的房间号; 73 | 第二行n个整数 a_i(0<=a_i<=10^9) ,代表每个房间分配后的人数。 74 | 75 | 76 | 输出描述: 77 | 输出n个整数,代表每个房间分配前的人数。 78 | 79 | 输入例子1: 80 | 3 1 81 | 6 5 1 82 | 83 | 输出例子1: 84 | 4 4 4 85 | 86 | 例子说明1: -------------------------------------------------------------------------------- /toutiao-8537039/1.football.cpp: -------------------------------------------------------------------------------- 1 | //编程题1 2 | #include 3 | #include 4 | #include 5 | 6 | using namespace std; 7 | 8 | int main() 9 | { 10 | int t; 11 | long long n, k, d1, d2; 12 | long long maxd, maxb, sum; 13 | cin >> t; 14 | while (t--) 15 | { 16 | cin >> n >> k >> d1 >> d2; 17 | //得分情况分4种 注意得分是否合法 18 | //maxb 第二个队伍可能的得分 19 | //sum 三个队分数相等时需要的场次 20 | //剩余的场次应该是3的倍数 21 | //1 b+d1 b b+d2 22 | maxd = max(d1, d2); 23 | maxb = (k - d1 - d2); 24 | sum = (maxd - d1) + maxd + (maxd - d2); 25 | if (maxb >= 0 && 26 | maxb % 3 == 0 && 27 | (n - k - sum) >= 0 && 28 | (n - k - sum) % 3 == 0) 29 | { 30 | cout << "yes" << endl; 31 | continue; 32 | } 33 | //2 b+d1 b b-d2 34 | maxb = (k - d1 + d2); 35 | sum = 0 + d1 + (d1 + d2); 36 | if (maxb >= 0 && 37 | maxb % 3 == 0 && 38 | maxb / 3 - d2 >= 0 && 39 | (n - k - sum) >= 0 && 40 | (n - k - sum) % 3 == 0) 41 | { 42 | cout << "yes" << endl; 43 | continue; 44 | } 45 | //3 b-d1 b b+d2 46 | maxb = (k - d2 + d1); 47 | sum = (d1 + d2) + d2 + 0; 48 | if (maxb >= 0 && 49 | maxb % 3 == 0 && 50 | maxb / 3 - d1 >= 0 && 51 | (n - k - sum) >= 0 && 52 | (n - k - sum ) % 3 == 0) 53 | { 54 | cout << "yes" << endl; 55 | continue; 56 | } 57 | //4 b-d1 b b-d2 58 | maxb = (k + d2 + d1); 59 | sum = d1 + d2; 60 | if (maxb >= 0 && 61 | maxb % 3 == 0 && 62 | maxb / 3 - d1 >= 0 && 63 | maxb / 3 - d2 >= 0 && 64 | (n - k - sum) >= 0 && 65 | (n - k - sum) % 3 == 0) 66 | { 67 | cout << "yes" << endl; 68 | continue; 69 | } 70 | cout << "no" << endl; 71 | } 72 | return 0; 73 | } -------------------------------------------------------------------------------- /wangyi-4111169/2.maxSum.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | int main() 6 | { 7 | int N, D; 8 | cin >> N >> D; 9 | vector> data(N, vector(N, 0)); 10 | D--; 11 | int maxResult = 0; 12 | //横 13 | for (int i = 0; i < N; i++) 14 | { 15 | int rowResult = 0; 16 | for (int j = 0; j < N; j++) 17 | { 18 | cin >> data[i][j]; 19 | rowResult += data[i][j]; 20 | if (j >= D) { 21 | maxResult = max(maxResult, rowResult); 22 | rowResult -= data[i][j - D]; 23 | } 24 | } 25 | } 26 | //列 27 | for (int i = 0; i < N; i++) 28 | { 29 | int colResult = 0; 30 | for (int j = 0; j < N; j++) 31 | { 32 | colResult += data[j][i]; 33 | if (j >= D) { 34 | maxResult = max(maxResult, colResult); 35 | colResult -= data[j - D][i]; 36 | } 37 | } 38 | } 39 | for (int i = 0; i < N; i++) 40 | { 41 | for (int j = 0; j < N; j++) 42 | { 43 | int lrResult = 0; 44 | int i1 = i, j1 = j; 45 | //左到右 46 | while (i1 < N&&j1 < N) 47 | { 48 | lrResult += data[i1][j1]; 49 | if (i1-i >= D) 50 | { 51 | maxResult = max(maxResult, lrResult); 52 | lrResult -= data[i1 - D][j1 - D]; 53 | } 54 | i1++; 55 | j1++; 56 | } 57 | int rlResult = 0; 58 | i1 = i; 59 | j1 = j; 60 | //左到右 61 | while (i1 < N&&j1 >= 0) 62 | { 63 | rlResult += data[i1][j1]; 64 | if (i1 - i >= D) 65 | { 66 | maxResult = max(maxResult, rlResult); 67 | rlResult -= data[i1 - D][D + j1]; 68 | } 69 | i1++; 70 | j1--; 71 | } 72 | } 73 | } 74 | cout << maxResult << endl; 75 | return 0; 76 | } -------------------------------------------------------------------------------- /toutiao-8537140/1.cube.cpp: -------------------------------------------------------------------------------- 1 | //附加题 2 | #include 3 | #include 4 | #include 5 | 6 | using namespace std; 7 | 8 | int GetPerfectValue(vector& value) 9 | { 10 | return value[0] * value[1] * value[2] * value[3] + 11 | value[4] * value[5] * value[10] * value[11] + 12 | value[6] * value[7] * value[12] * value[13] + 13 | value[8] * value[9] * value[14] * value[15] + 14 | value[16] * value[17] * value[18] * value[19] + 15 | value[20] * value[21] * value[22] * value[23] 16 | ; 17 | } 18 | //每一个面顺时针转动时置换矩阵 -1表示不变 19 | int mat[][24] = 20 | { 21 | { 1, 3, 0, 2, 23, 22, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 8 }, 22 | { 10, 4, -1, -1, 18, -1, -1, -1, -1, 0, 19, -1, -1, -1, -1, 1, -1, -1, 15, 9, 21, 23, 20, 22 }, 23 | { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, 20, 10, 11, 12, 13, 18, 16, 19, 17, 15, 14, -1, -1 }, 24 | { 20, -1, 22, -1, 10, 4, 0, -1, -1, -1, 11, 5, 2, -1, -1, -1, 6, -1, 12, -1, 16, -1, 18, -1 }, 25 | { -1, 21, -1, 23, -1, -1, -1, 1, 9, 15, -1, -1, -1, 3, 8, 14, -1, 7, -1, 13, -1, 17, -1, 19 }, 26 | { -1, -1, 11, 5, -1, 16, 12, 6, 2, -1, -1, 17, 13, 7, 3, -1, 14, 8, -1, -1, -1, -1, -1, -1 } 27 | }; 28 | 29 | 30 | void rotate(vector& value, int side) 31 | { 32 | vector newValue = value; 33 | for (size_t i = 0; i < 24; i++) 34 | { 35 | if (mat[side][i] != -1) 36 | newValue[i] = value[mat[side][i]]; 37 | } 38 | value = newValue; 39 | } 40 | 41 | void dfs(vector& value, int depth, int& maxValue) 42 | { 43 | maxValue = max(maxValue, GetPerfectValue(value)); 44 | if (depth == 5) 45 | { 46 | return; 47 | } 48 | vector tmp = value; 49 | for (size_t i = 0; i < 6; i++) 50 | { 51 | rotate(value, i); 52 | dfs(value, depth + 1, maxValue); 53 | rotate(value, i); 54 | rotate(value, i); 55 | dfs(value, depth + 1, maxValue); 56 | value = tmp; 57 | } 58 | } 59 | int main() 60 | { 61 | vector value(24, 0); 62 | for (size_t i = 0; i < 24; i++) 63 | { 64 | cin >> value[i]; 65 | } 66 | int maxValue = GetPerfectValue(value); 67 | dfs(value, 0, maxValue); 68 | cout << maxValue << endl; 69 | return 0; 70 | } -------------------------------------------------------------------------------- /leetcode/4.sortList.cpp: -------------------------------------------------------------------------------- 1 | //sort-list 2 | //https://www.nowcoder.com/practice/d75c232a0405427098a8d1627930bea6 3 | class Solution { 4 | public: 5 | //使用归并排序 6 | ListNode *sortList(ListNode *head) { 7 | ListNode* pNewHead = new ListNode(-1); 8 | pNewHead->next = head; 9 | sortList(pNewHead, getListLength(head)); 10 | head = pNewHead->next; 11 | delete pNewHead; 12 | return head; 13 | } 14 | 15 | void sortList(ListNode* pNewHead, int len) { 16 | if (len > 1) { 17 | //排序左边一半 18 | sortList(pNewHead, len / 2); 19 | //右边待排序链表头 20 | ListNode* pRightHead = getNode(pNewHead->next, len / 2 - 1); 21 | //排序右边 22 | sortList(pRightHead, len - len / 2); 23 | //合并链表 24 | pNewHead->next = mergeList(pNewHead->next, len / 2, pRightHead->next, len - len / 2); 25 | } 26 | } 27 | 28 | ListNode* getNode(ListNode* pNode, int len) { 29 | for (int i = 0; inext; 31 | } 32 | return pNode; 33 | } 34 | 35 | int getListLength(ListNode* pNode) 36 | { 37 | int len = 0; 38 | while (pNode) { 39 | len++; 40 | pNode = pNode->next; 41 | } 42 | return len; 43 | } 44 | 45 | //pNode1开始的len1+len2长度链表排序 46 | ListNode* mergeList(ListNode* pNode1, int len1, ListNode* pNode2, int len2) 47 | { 48 | ListNode* pNewHead = new ListNode(-1); 49 | ListNode* pNewNode = pNewHead; 50 | int i1 = 0; 51 | int i2 = 0; 52 | while (i1 < len1 && i2 val < pNode2->val) { 54 | pNewNode->next = pNode1; 55 | pNode1 = pNode1->next; 56 | i1++; 57 | } 58 | else { 59 | pNewNode->next = pNode2; 60 | pNode2 = pNode2->next; 61 | i2++; 62 | } 63 | pNewNode = pNewNode->next; 64 | } 65 | //新链表需要将其连到pNode2 66 | while (i1 < len1) { 67 | pNewNode->next = pNode1; 68 | pNode1 = pNode1->next; 69 | pNewNode = pNewNode->next; 70 | i1++; 71 | } 72 | pNewNode->next = pNode2; 73 | pNewNode = pNewHead->next; 74 | delete pNewHead; 75 | return pNewNode; 76 | } 77 | }; -------------------------------------------------------------------------------- /toutiao-8537279/ReadMe.md: -------------------------------------------------------------------------------- 1 | [今日头条2018校招后端方向(第一批)](https://www.nowcoder.com/test/8537279/summary) 2 | ==================== 3 | 4 | + 编程题1 5 | 6 | P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内) 7 | 8 | 如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。 9 | 10 | ![](https://github.com/reyzalx/nowcoder/raw/master/resources/8537279-1.jpg) 11 | 12 | 输入描述: 13 | 第一行输入点集的个数 N, 接下来 N 行,每行两个数字代表点的 X 轴和 Y 轴。 14 | 对于 50%的数据, 1 <= N <= 10000; 15 | 对于 100%的数据, 1 <= N <= 500000; 16 | 17 | 18 | 输出描述: 19 | 输出“最大的” 点集合, 按照 X 轴从小到大的方式输出,每行两个数字分别代表点的 X 轴和 Y轴。 20 | 示例1 21 | 输入 22 | 5 23 | 1 2 24 | 5 3 25 | 4 6 26 | 7 5 27 | 9 0 28 | 输出 29 | 4 6 30 | 7 5 31 | 9 0 32 | 33 | + 编程题2 34 | 35 | 给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个: 36 | 37 | 区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列  [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值: 38 | 39 |   40 | 41 | [6] = 6 * 6 = 36; 42 | 43 | [2] = 2 * 2 = 4; 44 | 45 | [1] = 1 * 1 = 1; 46 | 47 | [6,2] = 2 * 8 = 16; 48 | 49 | [2,1] = 1 * 3 = 3; 50 | 51 | [6, 2, 1] = 1 * 9 = 9; 52 | 53 |   54 | 55 | 从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。 56 | 57 | 区间内的所有数字都在[0, 100]的范围内; 58 | 59 | 60 | 输入描述: 61 | 第一行输入数组序列长度n,第二行输入数组序列。 62 | 对于 50%的数据, 1 <= n <= 10000; 63 | 对于 100%的数据, 1 <= n <= 500000; 64 | 65 | 66 | 输出描述: 67 | 输出数组经过计算后的最大值。 68 | 示例1 69 | 输入 70 | 3 71 | 6 2 1 72 | 输出 73 | 36 74 | 75 | + 编程题3 76 | 77 | 产品经理(PM)有很多好的idea,而这些idea需要程序员实现。现在有N个PM,在某个时间会想出一个 idea,每个 idea 有提出时间、所需时间和优先等级。对于一个PM来说,最想实现的idea首先考虑优先等级高的,相同的情况下优先所需时间最小的,还相同的情况下选择最早想出的,没有 PM 会在同一时刻提出两个 idea。 78 | 79 | 同时有M个程序员,每个程序员空闲的时候就会查看每个PM尚未执行并且最想完成的一个idea,然后从中挑选出所需时间最小的一个idea独立实现,如果所需时间相同则选择PM序号最小的。直到完成了idea才会重复上述操作。如果有多个同时处于空闲状态的程序员,那么他们会依次进行查看idea的操作。 80 | 81 | 求每个idea实现的时间。 82 | 83 | 输入第一行三个数N、M、P,分别表示有N个PM,M个程序员,P个idea。随后有P行,每行有4个数字,分别是PM序号、提出时间、优先等级和所需时间。输出P行,分别表示每个idea实现的时间点。 84 | 85 | 86 | 输入描述: 87 | 输入第一行三个数N、M、P,分别表示有N个PM,M个程序员,P个idea。随后有P行,每行有4个数字,分别是PM序号、提出时间、优先等级和所需时间。全部数据范围 [1, 3000]。 88 | 89 | 90 | 输出描述: 91 | 输出P行,分别表示每个idea实现的时间点。 92 | 示例1 93 | 输入 94 | 2 2 5 95 | 1 1 1 2 96 | 1 2 1 1 97 | 1 3 2 2 98 | 2 1 1 2 99 | 2 3 5 5 100 | 输出 101 | 3 102 | 4 103 | 5 104 | 3 105 | 9 -------------------------------------------------------------------------------- /toutiao-8537140/2.pushBox.cpp: -------------------------------------------------------------------------------- 1 | //编程题1 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | using namespace std; 12 | 13 | int rows, cols; 14 | vector mat; 15 | bool visited[50][50][50][50]; 16 | 17 | struct Step 18 | { 19 | int manx, many; 20 | int boxx, boxy; 21 | int times; 22 | 23 | bool checkman() 24 | { 25 | return manx >= 0 && manx < cols && many >= 0 && many < rows && mat[many][manx] == '.'; 26 | } 27 | 28 | bool checkbox() 29 | { 30 | return boxx >= 0 && boxx < cols && boxy >= 0 && boxy < rows && mat[boxy][boxx] == '.'; 31 | } 32 | bool checkvisit() 33 | { 34 | if (visited[manx][many][boxx][boxy]) 35 | return true; 36 | visited[manx][many][boxx][boxy] = true; 37 | return false; 38 | } 39 | }; 40 | 41 | int main(int argc, char** argv) { 42 | cin >> rows >> cols; 43 | mat.resize(rows); 44 | int expectx, expecty; 45 | Step InitStep; 46 | for (size_t i = 0; i < rows; i++) 47 | { 48 | cin >> mat[i]; 49 | for (size_t j = 0; j < cols; j++) 50 | { 51 | if (mat[i][j] == 'S') { 52 | InitStep.manx = j; 53 | InitStep.many = i; 54 | mat[i][j] = '.'; 55 | } 56 | if (mat[i][j] == '0') { 57 | InitStep.boxx = j; 58 | InitStep.boxy = i; 59 | mat[i][j] = '.'; 60 | } 61 | if (mat[i][j] == 'E') { 62 | expectx = j; 63 | expecty = i; 64 | mat[i][j] = '.'; 65 | } 66 | } 67 | } 68 | InitStep.times = 0; 69 | int dirs[4][2] = { 70 | { -1,0 }, 71 | { 0,1 }, 72 | { 1,0 }, 73 | { 0,-1 } 74 | }; 75 | memset(visited, 0, 50 * 50 * 50 * 50); 76 | queue q; 77 | q.push(InitStep); 78 | int result = -1; 79 | while (result == -1 && !q.empty()) 80 | { 81 | Step front = q.front(); 82 | q.pop(); 83 | for (size_t dir = 0; dir < 4; dir++) 84 | { 85 | //方向 左下右上 86 | Step nextStep = front; 87 | nextStep.times++; 88 | nextStep.manx += dirs[dir][0]; 89 | nextStep.many += dirs[dir][1]; 90 | if (!nextStep.checkman()) 91 | continue; 92 | if (nextStep.manx == nextStep.boxx && 93 | nextStep.many == nextStep.boxy) { 94 | nextStep.boxx += dirs[dir][0]; 95 | nextStep.boxy += dirs[dir][1]; 96 | if (!nextStep.checkbox()) 97 | continue; 98 | } 99 | if (nextStep.checkvisit()) 100 | continue; 101 | if (nextStep.boxx == expectx && 102 | nextStep.boxy == expecty) 103 | { 104 | //cout << "找到"< 2 | 3 | using namespace std; 4 | 5 | struct Task 6 | { 7 | int id; 8 | int pm; 9 | int time; 10 | int pri; 11 | int dur; 12 | }; 13 | 14 | vector> pmtasks; 15 | map result; 16 | int proid = 1; 17 | struct Programer 18 | { 19 | Programer() 20 | { 21 | t = 0; 22 | this->id = proid++; 23 | } 24 | int t;//当前的时间 25 | int id; 26 | int doTask() 27 | { 28 | vector::iterator findT; 29 | int index = -1; 30 | for (size_t i = 0; i < pmtasks.size(); i++) 31 | { 32 | auto& tasks = pmtasks.at(i); 33 | if (tasks.size() == 0) continue; 34 | auto it = tasks.begin(); 35 | while (it!= tasks.end() && it->time > t) 36 | it++; 37 | if (it == tasks.end()) continue; 38 | if (index == -1) 39 | { 40 | findT = it; 41 | index = i; 42 | } 43 | else 44 | { 45 | if (it->dur < findT->dur) 46 | { 47 | findT = it; 48 | index = i; 49 | } 50 | } 51 | } 52 | if (index != -1) 53 | { 54 | t += findT->dur; 55 | result[findT->id] = t; 56 | pmtasks.at(index).erase(findT); 57 | return 1; 58 | } 59 | else 60 | t++; 61 | return 0; 62 | } 63 | }; 64 | 65 | int main() 66 | { 67 | int n, m, p; 68 | cin >> n >> m >> p; 69 | pmtasks.resize(n); 70 | for (size_t i = 0; i < p; i++) 71 | { 72 | Task task; 73 | cin >> task.pm >> task.time >> task.pri >> task.dur; 74 | task.id = i; 75 | pmtasks.at(task.pm - 1).push_back(task); 76 | } 77 | for (size_t i = 0; i < pmtasks.size(); i++) 78 | { 79 | auto& tasks = pmtasks.at(i); 80 | if (tasks.size() == 0) continue; 81 | sort(tasks.begin(), tasks.end(), [](Task & t1, Task & t2) 82 | { 83 | if (t1.pri == t2.pri) 84 | { 85 | if (t1.dur == t2.dur) 86 | { 87 | return t1.time < t2.time; 88 | } 89 | else return t1.dur < t2.dur; 90 | } 91 | else return t1.pri > t2.pri; 92 | }); 93 | } 94 | vector pros(m); 95 | while (p > 0) 96 | { 97 | sort(pros.begin(), pros.end(), [&](Programer & t1, Programer & t2) 98 | { 99 | return t1.t < t2.t; 100 | }); 101 | p -= pros.begin()->doTask(); 102 | } 103 | for (auto &it : result) 104 | cout << it.second << endl; 105 | return 0; 106 | } -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | 牛客网部分编程题参考代码(所有代码在牛客网运行通过) 2 | ==================== 3 | 4 | ### 试题列表 5 | + [sword2offer](https://github.com/ReyzalX/nowcoder/tree/master/sword2offer) : [剑指Offer系列](https://www.nowcoder.com/ta/coding-interviews) 6 | + [leetcode](https://github.com/ReyzalX/nowcoder/tree/master/leetcode) : [牛客网leetcode在线编程](https://www.nowcoder.com/ta/leetcode) 7 | + [toutiao-8537279](https://github.com/ReyzalX/nowcoder/tree/master/toutiao-8537279) : [今日头条2018校招后端方向(第一批)](https://www.nowcoder.com/test/8537279/summary) 8 | + [toutiao-8537209](https://github.com/ReyzalX/nowcoder/tree/master/toutiao-8537209) : [今日头条2018校招后端方向(第二批)](https://www.nowcoder.com/test/8537209/summary) 9 | + [toutiao-8537140](https://github.com/ReyzalX/nowcoder/tree/master/toutiao-8537140) : [今日头条2018校招后端方向(第三批)](https://www.nowcoder.com/test/8537140/summary) 10 | + [toutiao-8537039](https://github.com/ReyzalX/nowcoder/tree/master/toutiao-8537039) : [今日头条2018校招后端方向(第四批)](https://www.nowcoder.com/test/8537039/summary) 11 | + [meituan-5583018](https://github.com/ReyzalX/nowcoder/tree/master/meituan-5583018) : [美团点评2017秋招笔试编程题](https://www.nowcoder.com/test/5583018/summary) 12 | + [iqiyi-8246915](https://github.com/ReyzalX/nowcoder/tree/master/iqiyi-8246915) : [爱奇艺2018秋季校招算法工程师(第一场)](https://www.nowcoder.com/test/8246915/summary) 13 | + [iqiyi-8246859](https://github.com/ReyzalX/nowcoder/tree/master/iqiyi-8246859) : [爱奇艺2018秋季校招算法工程师(第二场)](https://www.nowcoder.com/test/8246859/summary) 14 | + [iqiyi-8246879](https://github.com/ReyzalX/nowcoder/tree/master/iqiyi-8246879) : [爱奇艺2018秋季校招算法工程师(第三场)](https://www.nowcoder.com/test/8246879/summary) 15 | + [wangyi-6910869](https://github.com/ReyzalX/nowcoder/tree/master/wangyi-6910869) : [网易2018校园招聘编程题真题集合](https://www.nowcoder.com/test/6910869/summary) 16 | + [wangyi-2811407](https://github.com/ReyzalX/nowcoder/tree/master/wangyi-2811407) : [网易2017秋招编程题集合](https://www.nowcoder.com/test/2811407/summary) 17 | + [wangyi-4575457](https://github.com/ReyzalX/nowcoder/tree/master/wangyi-4575457) : [网易2017春招笔试真题编程题集合](https://www.nowcoder.com/test/4575457/summary) 18 | + [wangyi-4111169](https://github.com/ReyzalX/nowcoder/tree/master/wangyi-4111169) : [2017网易游戏雷火盘古实习生招聘笔试真题](https://www.nowcoder.com/test/4111169/summary) 19 | + [wangyi-2385858](https://github.com/ReyzalX/nowcoder/tree/master/wangyi-2385858) : [网易有道2017内推编程题](https://www.nowcoder.com/test/2385858/summary) 20 | + [tengxun-1725829](https://github.com/ReyzalX/nowcoder/tree/master/tengxun-1725829) : [腾讯2017暑期实习生编程题](https://www.nowcoder.com/test/1725829/summary) 21 | + [tengxun-5582994](https://github.com/ReyzalX/nowcoder/tree/master/tengxun-5582994) : [腾讯2017秋招笔试编程题](https://www.nowcoder.com/test/5582994/summary) 22 | + [nowcoder-9439037](https://github.com/ReyzalX/nowcoder/tree/master/nowcoder-9439037) : [2018年校招全国统一模拟笔试(第一场)编程题集合](https://www.nowcoder.com/test/9439037/summary) 23 | + [wangyi-9763997](https://github.com/ReyzalX/nowcoder/tree/master/wangyi-9763997) : [网易2019实习生招聘编程题集合](https://www.nowcoder.com/test/9763997/summary) 24 | -------------------------------------------------------------------------------- /wangyi-4111169/3.pushBox.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | using namespace std; 4 | 5 | bool visited[8][8][8][8]; 6 | int N, M; 7 | 8 | vector mmap; 9 | 10 | struct Pos 11 | { 12 | int stage; 13 | int manx, many; 14 | int boxx, boxy; 15 | bool checkman() 16 | { 17 | if (manx < 0 || manx >= N || many < 0 || many >= M || mmap[manx][many] != '.') 18 | { 19 | return false; 20 | } 21 | return true; 22 | } 23 | bool checkbox() 24 | { 25 | if (boxx < 0 || boxx >= N || boxy < 0 || boxy >= M || mmap[boxx][boxy] != '.') 26 | { 27 | return false; 28 | } 29 | return true; 30 | } 31 | bool checkvisited() 32 | { 33 | if (visited[boxx][boxy][manx][many]) 34 | { 35 | return true; 36 | } 37 | visited[boxx][boxy][manx][many] = true; 38 | return false; 39 | } 40 | }; 41 | 42 | int main() 43 | { 44 | cin >> N >> M; 45 | int startx, starty; 46 | int boxx, boxy; 47 | int finishx, finishy; 48 | memset(visited, false, 8 * 8 * 8 * 8); 49 | for (int i = 0; i < N; i++) 50 | { 51 | string s; 52 | cin >> s; 53 | for (int j = 0; j < s.length(); j++) 54 | { 55 | if (s[j] == 'X') 56 | { 57 | startx = i; 58 | starty = j; 59 | s[j] = '.'; 60 | } 61 | else if (s[j] == '*') 62 | { 63 | boxx = i; 64 | boxy = j; 65 | s[j] = '.'; 66 | } 67 | else if (s[j] == '@') 68 | { 69 | finishx = i; 70 | finishy = j; 71 | s[j] = '.'; 72 | } 73 | } 74 | mmap.push_back(s); 75 | } 76 | Pos startPos; 77 | startPos.boxx = boxx; 78 | startPos.boxy = boxy; 79 | startPos.manx = startx; 80 | startPos.many = starty; 81 | startPos.stage = 0; 82 | queue q; 83 | q.push(startPos); 84 | int result = -1; 85 | while (result == -1 && !q.empty()) 86 | { 87 | Pos curPos = q.front(); 88 | q.pop(); 89 | static int dir[][2] = { 90 | { -1,0 }, 91 | { 1,0 }, 92 | { 0,1 }, 93 | { 0,-1 } 94 | }; 95 | for (int i = 0; i < 4; i++) 96 | { 97 | Pos newPos = curPos; 98 | newPos.stage++; 99 | newPos.manx += dir[i][0]; 100 | newPos.many += dir[i][1]; 101 | if (!newPos.checkman()) 102 | { 103 | continue; 104 | } 105 | if (newPos.manx == newPos.boxx && newPos.many == newPos.boxy) 106 | { 107 | newPos.boxx += dir[i][0]; 108 | newPos.boxy += dir[i][1]; 109 | } 110 | if (!newPos.checkbox()) 111 | { 112 | continue; 113 | } 114 | if (newPos.checkvisited()) 115 | { 116 | continue; 117 | } 118 | if (curPos.boxx == finishx && curPos.boxy == finishy) 119 | { 120 | result = curPos.stage; 121 | break; 122 | } 123 | q.push(newPos); 124 | } 125 | } 126 | cout << result << endl; 127 | return 0; 128 | } -------------------------------------------------------------------------------- /wangyi-2811407/ReadMe.md: -------------------------------------------------------------------------------- 1 | [网易2017秋招编程题集合](https://www.nowcoder.com/test/2811407/summary) 2 | ==================== 3 | 4 | + 编程题1 回文序列 5 | 6 | 如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如: 7 | {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, 8 | {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。 9 | 现在给出一个数字序列,允许使用一种转换操作: 10 | 选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。 11 | 现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。 12 | 13 | 输入描述: 14 | 输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50) 第二行为序列中的n个整数item[i] (1 ≤ iteam[i] ≤ 1000),以空格分隔。 15 | 16 | 17 | 输出描述: 18 | 输出一个数,表示最少需要的转换次数 19 | 示例1 20 | 输入 21 | 4 1 1 1 3 22 | 输出 23 | 2 24 | 25 | + 编程题2 优雅的点 26 | 27 | 小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。 28 | 例如:半径的平方如果为25 29 | 优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点。 30 | 输入描述: 31 | 输入为一个整数,即为圆半径的平方,范围在32位int范围内。 32 | 33 | 34 | 输出描述: 35 | 输出为一个整数,即为优雅的点的个数 36 | 示例1 37 | 输入 38 | 25 39 | 输出 40 | 12 41 | 42 | + 编程题3 跳石板 43 | 44 | 小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3....... 45 | 这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。 46 | 例如: 47 | N = 4,M = 24: 48 | 4->6->8->12->18->24 49 | 于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板 50 | 输入描述: 51 | 输入为一行,有两个整数N,M,以空格隔开。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000) 52 | 53 | 54 | 输出描述: 55 | 输出小易最少需要跳跃的步数,如果不能到达输出-1 56 | 示例1 57 | 输入 58 | 4 24 59 | 输出 60 | 5 61 | 62 | + 编程题4 暗黑的字符串 63 | 64 | 一个只包含'A'、'B'和'C'的字符串,如果存在某一段长度为3的连续子串中恰好'A'、'B'和'C'各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的。例如: 65 | BAACAACCBAAA 连续子串"CBA"中包含了'A','B','C'各一个,所以是纯净的字符串 66 | AABBCCAABB 不存在一个长度为3的连续子串包含'A','B','C',所以是暗黑的字符串 67 | 你的任务就是计算出长度为n的字符串(只包含'A'、'B'和'C'),有多少个是暗黑的字符串。 68 | 输入描述: 69 | 输入一个整数n,表示字符串长度(1 ≤ n ≤ 30) 70 | 71 | 72 | 输出描述: 73 | 输出一个整数表示有多少个暗黑字符串 74 | 示例1 75 | 输入 76 | 2 3 77 | 输出 78 | 9 21 79 | 80 | + 编程题5 数字翻转 81 | 82 | 对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如: 83 | 如果 X = 123,则rev(X) = 321; 84 | 如果 X = 100,则rev(X) = 1. 85 | 现在给出整数x和y,要求rev(rev(x) + rev(y))为多少? 86 | 输入描述: 87 | 输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。 88 | 89 | 90 | 输出描述: 91 | 输出rev(rev(x) + rev(y))的值 92 | 示例1 93 | 输入 94 | 123 100 95 | 输出 96 | 223 97 | 98 | + 编程题6 最大的奇约数 99 | 100 | 小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 101 | 现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N) 102 | 例如: N = 7 103 | f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21 104 | 小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。 105 | 输入描述: 106 | 输入一个整数N (1 ≤ N ≤ 1000000000) 107 | 108 | 109 | 输出描述: 110 | 输出一个整数,即为f(1) + f(2) + f(3).......f(N) 111 | 示例1 112 | 输入 113 | 7 114 | 输出 115 | 21 116 | 117 | + 编程题7 买苹果 118 | 119 | 小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。 120 | 输入描述: 121 | 输入一个整数n,表示小易想购买n(1 ≤ n ≤ 100)个苹果 122 | 123 | 124 | 输出描述: 125 | 输出一个整数表示最少需要购买的袋数,如果不能买恰好n个苹果则输出-1 126 | 示例1 127 | 输入 128 | 20 129 | 输出 130 | 3 131 | 132 | + 编程题8 计算糖果 133 | 134 | A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息: 135 | A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数. 136 | 现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。 137 | 输入描述: 138 | 输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。 范围均在-30到30之间(闭区间)。 139 | 140 | 141 | 输出描述: 142 | 输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。 如果不存在这样的整数A,B,C,则输出No 143 | 示例1 144 | 输入 145 | 1 -2 3 4 146 | 输出 147 | 2 1 3 -------------------------------------------------------------------------------- /nowcoder-9439037/ReadMe.md: -------------------------------------------------------------------------------- 1 | [2018年校招全国统一模拟笔试(第一场)编程题集合](https://www.nowcoder.com/test/9439037/summary) 2 | ==================== 3 | 4 | + 编程题1 密码翻译 5 | 6 | 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,则可得到一个简单的加密字符串。 7 | 输入描述: 8 | 用gets(s)方式读取这一行字符串.每个字符串长度小于80个字符。 9 | 10 | 11 | 输出描述: 12 | 对于每组数据,输出每行字符串的加密字符串。 13 | 14 | 输入例子1: 15 | Hello! How are you! 16 | 17 | 输出例子1: 18 | Ifmmp! Ipx bsf zpv! 19 | 20 | + 编程题2 寻宝 21 | 22 | 亮亮解出了卷轴隐藏的秘密,来到了一片沼泽地。这里有很多空地,而面试直通卡可能埋在任意一块空地中,好在亮亮发现了一堆木材,他可以将木材铺在两个空地之间的沼泽地上。因为亮亮不知道面试直通卡具体在哪一块空地中,所以必须要保证任意一块空地对于亮亮来说是可以抵达的。 “怎么还有鳄鱼!没办法,看来有些空地不能直接到达了。” 亮亮虽然没有洁癖,但是沼泽地实在太臭了,所以亮亮不会循环利用木材。而且木材不能拼接在一起使用,所以亮亮必须要知道在耗费木材最少的情况下,最长的那根木材至少需要多长。 23 | 24 | 输入描述: 25 | 第一行包含两个整数N(1≤N≤10000),M(1≤M≤1000000)。N表示公有N块空地。 26 | 接下来M行,每行包含三个整数P(1≤P≤N),Q(1≤Q≤N),K代表P,Q两个间没有鳄鱼,需要耗费K的木材。 27 | 28 | 29 | 输出描述: 30 | 一个整数,即耗费木材最少的情况下,最长的那根木材长度。 31 | 32 | 输入例子1: 33 | 4 3 34 | 1 2 1 35 | 2 3 1 36 | 3 4 2 37 | 38 | 输出例子1: 39 | 2 40 | 41 | + 编程题3 打车 42 | 43 | 妞妞参加完Google Girl Hackathon之后,打车回到了牛家庄。 44 | 45 | 妞妞需要支付给出租车司机车费s元。妞妞身上一共有n个硬币,第i个硬币价值为p[i]元。 46 | 47 | 妞妞想选择尽量多的硬币,使其总价值足以支付s元车费(即大于等于s)。 48 | 49 | 50 | 但是如果从妞妞支付的这些硬币中移除一个或者多个硬币,剩下的硬币总价值还是足以支付车费的话,出租车司机是不会接受的。例如: 妞妞使用价值为2,5,7的硬币去支付s=11的车费,出租车司机是不会接受的,因为价值为2这个硬币是可以移除的。 51 | 52 | 53 | 妞妞希望能选取最大数量的硬币,使其总价值足以支付车费并且出租车司机能接受。 54 | 55 | 妞妞希望你能帮她计算最多可以支付多少个硬币。 56 | 57 | 58 | 输入描述: 59 | 输入包括两行, 第一行包括两个正整数n和s(1 <= n <= 10, 1 <= s <= 1000), 表示妞妞的硬币个数和需要支付的车费。 60 | 第二行包括n个正整数p[i] (1 <= p[i] <= 100),表示第i个硬币的价值。 61 | 保证妞妞的n个硬币价值总和是大于等于s。 62 | 63 | 64 | 输出描述: 65 | 输出一个整数, 表示妞妞最多可以支付的硬币个数。 66 | 67 | 输入例子1: 68 | 5 9 69 | 4 1 3 5 4 70 | 71 | 输出例子1: 72 | 3 73 | 74 | 例子说明1: 75 | 76 | 77 | + 编程题4 美丽的项链 78 | 79 | 妞妞参加了Nowcoder Girl女生编程挑战赛, 但是很遗憾, 她没能得到她最喜欢的黑天鹅水晶项链。 80 | 81 | 于是妞妞决定自己来制作一条美丽的项链。一条美丽的项链需要满足以下条件: 82 | 83 | 1、需要使用n种特定的水晶宝珠 84 | 85 | 2、第i种水晶宝珠的数量不能少于li颗, 也不能多于ri颗 86 | 87 | 3、一条美丽的项链由m颗宝珠组成 88 | 89 | 妞妞意识到满足条件的项链种数可能会很多, 所以希望你来帮助她计算一共有多少种制作美丽的项链的方案。 90 | 91 | 92 | 输入描述: 93 | 输入包括n+1行, 第一行包括两个正整数(1 <= n <= 20, 1 <= m <= 100), 表示水晶宝珠的种数和一条美丽的项链需要的水晶宝珠的数量。 94 | 95 | 接下来的n行, 每行两个整数li, ri(0 <= li <= ri <= 10), 表示第i种宝珠的数量限制区间。 96 | 97 | 98 | 99 | 输出描述: 100 | 输出一个整数, 表示满足限定条件的方案数。保证答案在64位整数范围内。 101 | 102 | 输入例子1: 103 | 3 5 104 | 0 3 105 | 0 3 106 | 0 3 107 | 108 | 输出例子1: 109 | 12 110 | 111 | 例子说明1: 112 | 113 | + 编程题5 排列 114 | 115 | 妞妞得到一个(1~n)的排列p1, p2, p3,...,pn, 听村里的老人牛牛说如果让这个排列变为: 116 | 117 | 对于所有的1 <= i <= n, 都满足pi ≠ i, 就可以获得Google Girl Hackathon的入场券。 118 | 119 | 妞妞仅允许的操作是: 交换排列中两个相邻的元素, 并且妞妞允许做这个操作任意次。 120 | 121 | 但是Google Girl Hackathon就快要开始了, 妞妞希望做最少的操作就使排列满足要求, 妞妞希望你能帮助她。 122 | 123 | 124 | 输入描述: 125 | 输入包括两行, 第一行包括一个正整数n(2 <= n <= 10^5), 表示排列的长度和范围。 126 | 第二行包括n个正整数p1, p2, p3,...,pn, 即妞妞得到的排列, 保证是一个1~n的排列。 127 | 128 | 129 | 输出描述: 130 | 输出一个整数, 表示妞妞需要的操作次数。 131 | 132 | 输入例子1: 133 | 5 134 | 1 4 3 5 2 135 | 136 | 输出例子1: 137 | 2 138 | 139 | 例子说明1: 140 | 141 | + 编程题6 勇敢的妞妞 142 | 143 | 美丽的牛家庄受到了外星人的侵略, 勇敢的妞妞要上战场抵御侵略。 144 | 145 | 146 | 在妞妞上战场前, 村长牛牛给了妞妞N件装备, 妞妞需要选择其中的K件,装备在身上提升自己的战斗力。每件装备有5种属性增幅值,对于第i件装备它的属性增幅值为(ri1, ri2, ri3, ri4, ri5), 分别代表该装备对不同的属性值增幅。 147 | 148 | 当妞妞装备多件装备的时候,由于装备之前会互相影响, 对于每种属性值的增幅并不是所有装备该属性值之和, 而是该种属性值下所有装备中最大的属性值。而妞妞最终增加的战斗力为这5种属性值增幅之和。 149 | 150 | 151 | 妞妞一定要保卫牛家庄, 所以她希望她能提升尽可能多的战斗力, 请你帮帮她计算她最多能增加多少战斗力。 152 | 153 | 154 | 输入描述: 155 | 输入包括N+1行, 156 | 157 | 第一行包括两个正整数N和K(1 <= N <= 10000, 1 <= K <= N), 分别表示一共有的装备数量和妞妞需要选择的装备数量。 158 | 159 | 接下来的N行,每行5个整数ri1, ri2, ri3, ri4, ri5 (0 <= ri1, ri2, ri3, ri4, ri5 <= 10000)表示第i件装备的5种属性值增幅。 160 | 161 | 162 | 163 | 输出描述: 164 | 输出一个整数,表示妞妞最多能增加的战斗力。 165 | 166 | 输入例子1: 167 | 4 2 168 | 30 30 30 30 0 169 | 50 0 0 0 0 170 | 0 50 0 50 10 171 | 0 0 50 0 20 172 | 173 | 输出例子1: 174 | 170 175 | 176 | 例子说明1: 177 | 妞妞要从4件装备中选取2件, 如果妞妞选择第1件和第3件装备,那么增加的战斗力为30 + 50 + 30 + 50 + 10 = 170, 这是最大的方案。 -------------------------------------------------------------------------------- /wangyi-9763997/ReadMe.md: -------------------------------------------------------------------------------- 1 | [网易2019实习生招聘编程题集合](https://www.nowcoder.com/test/9763997/summary) 2 | ==================== 3 | 4 | + 编程题1 牛牛找工作 5 | 6 | 为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。 7 | 输入描述: 8 | 每个输入包含一个测试用例。 9 | 每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。 10 | 接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。 11 | 接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。 12 | 保证不存在两项工作的报酬相同。 13 | 14 | 15 | 输出描述: 16 | 对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。 17 | 示例1 18 | 输入 19 | 3 3 20 | 1 100 21 | 10 1000 22 | 1000000000 1001 23 | 9 10 1000000000 24 | 输出 25 | 100 26 | 1000 27 | 1001 28 | 29 | + 编程题2 被3整除 30 | 31 | 小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。 32 | 33 | 并且小Q对于能否被3整除这个性质很感兴趣。 34 | 35 | 小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。 36 | 37 | 38 | 输入描述: 39 | 输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。 40 | 41 | 42 | 输出描述: 43 | 输出一个整数, 表示区间内能被3整除的数字个数。 44 | 示例1 45 | 输入 46 | 2 5 47 | 输出 48 | 3 49 | 说明 50 | 12, 123, 1234, 12345... 51 | 其中12, 123, 12345能被3整除。 52 | 53 | + 编程题3 安置路灯 54 | 55 | 小Q正在给一条长度为n的道路设计路灯安置方案。 56 | 57 | 为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用'.'表示, 不需要照亮的障碍物格子用'X'表示。 58 | 59 | 小Q现在要在道路上设置一些路灯, 对于安置在pos位置的路灯, 这盏路灯可以照亮pos - 1, pos, pos + 1这三个位置。 60 | 61 | 小Q希望能安置尽量少的路灯照亮所有'.'区域, 希望你能帮他计算一下最少需要多少盏路灯。 62 | 63 | 64 | 输入描述: 65 | 输入的第一行包含一个正整数t(1 <= t <= 1000), 表示测试用例数 66 | 接下来每两行一个测试数据, 第一行一个正整数n(1 <= n <= 1000),表示道路的长度。 67 | 第二行一个字符串s表示道路的构造,只包含'.'和'X'。 68 | 69 | 70 | 输出描述: 71 | 对于每个测试用例, 输出一个正整数表示最少需要多少盏路灯。 72 | 示例1 73 | 输入 74 | 2 75 | 3 76 | .X. 77 | 11 78 | ...XX....XX 79 | 输出 80 | 1 81 | 3 82 | 83 | + 编程题4 迷路的牛牛 84 | 85 | 牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。 86 | 输入描述: 87 | 每个输入包含一个测试用例。 88 | 每个测试用例的第一行包含一个正整数,表示转方向的次数N(N<=1000)。 89 | 接下来的一行包含一个长度为N的字符串,由L和R组成,L表示向左转,R表示向右转。 90 | 91 | 92 | 输出描述: 93 | 输出牛牛最后面向的方向,N表示北,S表示南,E表示东,W表示西。 94 | 示例1 95 | 输入 96 | 3 97 | LRR 98 | 输出 99 | E 100 | 101 | + 编程题5 数对 102 | 103 | 牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。 104 | 105 | 但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。 106 | 牛牛希望你能帮他计算一共有多少个可能的数对。 107 | 108 | 109 | 输入描述: 110 | 输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。 111 | 112 | 113 | 输出描述: 114 | 对于每个测试用例, 输出一个正整数表示可能的数对数量。 115 | 示例1 116 | 输入 117 | 5 2 118 | 输出 119 | 7 120 | 说明 121 | 满足条件的数对有(2,3),(2,4),(2,5),(3,4),(3,5),(4,5),(5,3) 122 | 123 | + 编程题6 矩形重叠 124 | 125 | 平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。 126 | 127 | 如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。 128 | 129 | 请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。 130 | 131 | 132 | 输入描述: 133 | 输入包括五行。 134 | 第一行包括一个整数n(2 <= n <= 50), 表示矩形的个数。 135 | 第二行包括n个整数x1[i](-10^9 <= x1[i] <= 10^9),表示左下角的横坐标。 136 | 第三行包括n个整数y1[i](-10^9 <= y1[i] <= 10^9),表示左下角的纵坐标。 137 | 第四行包括n个整数x2[i](-10^9 <= x2[i] <= 10^9),表示右上角的横坐标。 138 | 第五行包括n个整数y2[i](-10^9 <= y2[i] <= 10^9),表示右上角的纵坐标。 139 | 140 | 141 | 输出描述: 142 | 输出一个正整数, 表示最多的地方有多少个矩形相互重叠,如果矩形都不互相重叠,输出1。 143 | 示例1 144 | 输入 145 | 2 146 | 0 90 147 | 0 90 148 | 100 200 149 | 100 200 150 | 输出 151 | 2 152 | 153 | + 编程题7 牛牛的闹钟 154 | 155 | 牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要X分钟到达教室,上课时间为当天的A时B分,请问他最晚可以什么时间起床 156 | 输入描述: 157 | 每个输入包含一个测试用例。 158 | 每个测试用例的第一行包含一个正整数,表示闹钟的数量N(N<=100)。 159 | 接下来的N行每行包含两个整数,表示这个闹钟响起的时间为Hi(0<=A<24)时Mi(0<=B<60)分。 160 | 接下来的一行包含一个整数,表示从起床算起他需要X(0<=X<=100)分钟到达教室。 161 | 接下来的一行包含两个整数,表示上课时间为A(0<=A<24)时B(0<=B<60)分。 162 | 数据保证至少有一个闹钟可以让牛牛及时到达教室。 163 | 164 | 165 | 输出描述: 166 | 输出两个整数表示牛牛最晚起床时间。 167 | 示例1 168 | 输入 169 | 3 170 | 5 0 171 | 6 0 172 | 7 0 173 | 59 174 | 6 59 175 | 输出 176 | 6 0 177 | 178 | + 编程题8 牛牛的背包问题 179 | 180 | 牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。 181 | 牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。 182 | 牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。 183 | 184 | 输入描述: 185 | 输入包括两行 186 | 第一行为两个正整数n和w(1 <= n <= 30, 1 <= w <= 2 * 10^9),表示零食的数量和背包的容量。 187 | 第二行n个正整数v[i](0 <= v[i] <= 10^9),表示每袋零食的体积。 188 | 189 | 190 | 输出描述: 191 | 输出一个正整数, 表示牛牛一共有多少种零食放法。 192 | 示例1 193 | 输入 194 | 3 10 195 | 1 2 4 196 | 输出 197 | 8 198 | 说明 199 | 三种零食总体积小于10,于是每种零食有放入和不放入两种情况,一共有2*2*2 = 8种情况。 -------------------------------------------------------------------------------- /wangyi-6910869/ReadMe.md: -------------------------------------------------------------------------------- 1 | [网易2018校园招聘编程题真题集合](https://www.nowcoder.com/test/6910869/summary) 2 | ==================== 3 | 4 | + 编程题1 魔法币 5 | 6 | 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。 7 | 魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币 8 | 魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币 9 | 小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。 10 | 输入描述: 11 | 输入包括一行,包括一个正整数n(1 ≤ n ≤ 10^9),表示小易需要的魔法币数量。 12 | 13 | 14 | 输出描述: 15 | 输出一个字符串,每个字符表示该次小易选取投入的魔法机器。其中只包含字符'1'和'2'。 16 | 17 | 输入例子1: 18 | 10 19 | 20 | 输出例子1: 21 | 122 22 | 23 | + 编程题2 相反数 24 | 25 | 为了得到一个数的"相反数",我们将这个数的数字顺序颠倒,然后再加上原先的数得到"相反数"。例如,为了得到1325的"相反数",首先我们将该数的数字顺序颠倒,我们得到5231,之后再加上原先的数,我们得到5231+1325=6556.如果颠倒之后的数字有前缀零,前缀零将会被忽略。例如n = 100, 颠倒之后是1. 26 | 输入描述: 27 | 输入包括一个整数n,(1 ≤ n ≤ 10^5) 28 | 29 | 30 | 输出描述: 31 | 输出一个整数,表示n的相反数 32 | 33 | 输入例子1: 34 | 1325 35 | 36 | 输出例子1: 37 | 6556 38 | 39 | + 编程题3 字符串碎片 40 | 41 | 一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。 42 | 43 | 输入描述: 44 | 输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s只含小写字母('a'-'z') 45 | 46 | 47 | 输出描述: 48 | 输出一个整数,表示所有碎片的平均长度,四舍五入保留两位小数。 49 | 50 | 如样例所示: s = "aaabbaaac" 51 | 所有碎片的平均长度 = (3 + 2 + 3 + 1) / 4 = 2.25 52 | 53 | 输入例子1: 54 | aaabbaaac 55 | 56 | 输出例子1: 57 | 2.25 58 | 59 | + 编程题4 游历魔法王国 60 | 61 | 魔法王国一共有n个城市,编号为0~n-1号,n个城市之间的道路连接起来恰好构成一棵树。 62 | 小易现在在0号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动L次。 63 | 如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,请你帮他计算一下他最多能游历过多少个城市(注意0号城市已经游历了,游历过的城市不重复计算)。 64 | 输入描述: 65 | 输入包括两行,第一行包括两个正整数n(2 ≤ n ≤ 50)和L(1 ≤ L ≤ 100),表示城市个数和小易能行动的次数。 66 | 第二行包括n-1个整数parent[i](0 ≤ parent[i] ≤ i), 对于每个合法的i(0 ≤ i ≤ n - 2),在(i+1)号城市和parent[i]间有一条道路连接。 67 | 68 | 69 | 输出描述: 70 | 输出一个整数,表示小易最多能游历的城市数量。 71 | 72 | 输入例子1: 73 | 5 2 74 | 0 1 2 3 75 | 76 | 输出例子1: 77 | 3 78 | 79 | + 编程题5 重排数列 80 | 81 | 小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]..., A[N]}。 82 | 牛博士给小易出了一个难题: 83 | 对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。 84 | 小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。 85 | 输入描述: 86 | 输入的第一行为数列的个数t(1 ≤ t ≤ 10), 87 | 接下来每两行描述一个数列A,第一行为数列长度n(1 ≤ n ≤ 10^5) 88 | 第二行为n个正整数A[i](1 ≤ A[i] ≤ 10^9) 89 | 90 | 91 | 输出描述: 92 | 对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出Yes,否则输出No。 93 | 94 | 输入例子1: 95 | 2 96 | 3 97 | 1 10 100 98 | 4 99 | 1 2 3 4 100 | 101 | 输出例子1: 102 | Yes 103 | No 104 | 105 | + 编程题6 最长公共子括号序列 106 | 107 | 一个合法的括号匹配序列被定义为: 108 | 1. 空串""是合法的括号序列 109 | 2. 如果"X"和"Y"是合法的序列,那么"XY"也是一个合法的括号序列 110 | 3. 如果"X"是一个合法的序列,那么"(X)"也是一个合法的括号序列 111 | 4. 每个合法的括号序列都可以由上面的规则生成 112 | 例如"", "()", "()()()", "(()())", "(((()))"都是合法的。 113 | 从一个字符串S中移除零个或者多个字符得到的序列称为S的子序列。 114 | 例如"abcde"的子序列有"abe","","abcde"等。 115 | 定义LCS(S,T)为字符串S和字符串T最长公共子序列的长度,即一个最长的序列W既是S的子序列也是T的子序列的长度。 116 | 小易给出一个合法的括号匹配序列s,小易希望你能找出具有以下特征的括号序列t: 117 | 1、t跟s不同,但是长度相同 118 | 2、t也是一个合法的括号匹配序列 119 | 3、LCS(s, t)是满足上述两个条件的t中最大的 120 | 因为这样的t可能存在多个,小易需要你计算出满足条件的t有多少个。 121 | 122 | 如样例所示: s = "(())()",跟字符串s长度相同的合法括号匹配序列有: 123 | "()(())", "((()))", "()()()", "(()())",其中LCS( "(())()", "()(())" )为4,其他三个都为5,所以输出3. 124 | 输入描述: 125 | 输入包括字符串s(4 ≤ |s| ≤ 50,|s|表示字符串长度),保证s是一个合法的括号匹配序列。 126 | 127 | 128 | 输出描述: 129 | 输出一个正整数,满足条件的t的个数。 130 | 131 | 输入例子1: 132 | (())() 133 | 134 | 输出例子1: 135 | 3 136 | 137 | + 编程题7 合唱 138 | 139 | 小Q和牛博士合唱一首歌曲,这首歌曲由n个音调组成,每个音调由一个正整数表示。 140 | 对于每个音调要么由小Q演唱要么由牛博士演唱,对于一系列音调演唱的难度等于所有相邻音调变化幅度之和, 例如一个音调序列是8, 8, 13, 12, 那么它的难度等于|8 - 8| + |13 - 8| + |12 - 13| = 6(其中||表示绝对值)。 141 | 现在要对把这n个音调分配给小Q或牛博士,让他们演唱的难度之和最小,请你算算最小的难度和是多少。 142 | 如样例所示: 小Q选择演唱{5, 6}难度为1, 牛博士选择演唱{1, 2, 1}难度为2,难度之和为3,这一个是最小难度和的方案了。 143 | 输入描述: 144 | 输入包括两行,第一行一个正整数n(1 ≤ n ≤ 2000) 第二行n个整数v[i](1 ≤ v[i] ≤ 10^6), 表示每个音调。 145 | 146 | 147 | 输出描述: 148 | 输出一个整数,表示小Q和牛博士演唱最小的难度和是多少。 149 | 150 | 输入例子1: 151 | 5 152 | 1 5 6 2 1 153 | 154 | 输出例子1: 155 | 3 156 | 157 | + 编程题8 射击游戏 158 | 159 | 小易正在玩一款新出的射击游戏,这个射击游戏在一个二维平面进行,小易在坐标原点(0,0),平面上有n只怪物,每个怪物有所在的坐标(x[i], y[i])。小易进行一次射击会把x轴和y轴上(包含坐标原点)的怪物一次性消灭。 160 | 小易是这个游戏的VIP玩家,他拥有两项特权操作: 161 | 1、让平面内的所有怪物同时向任意同一方向移动任意同一距离 162 | 2、让平面内的所有怪物同时对于小易(0,0)旋转任意同一角度 163 | 小易要进行一次射击。小易在进行射击前,可以使用这两项特权操作任意次。 164 | 小易想知道在他射击的时候最多可以同时消灭多少只怪物,请你帮帮小易。 165 | 166 | 如样例所示: 167 | 168 | ![](https://github.com/reyzalx/nowcoder/raw/master/resources/6910869-1.png) 169 | 170 | 所有点对于坐标原点(0,0)顺时针或者逆时针旋转45°,可以让所有点都在坐标轴上,所以5个怪物都可以消灭。 171 | 172 | 输入描述: 173 | 输入包括三行。 174 | 第一行中有一个正整数n(1 ≤ n ≤ 50),表示平面内的怪物数量。 175 | 第二行包括n个整数x[i](-1,000,000 ≤ x[i] ≤ 1,000,000),表示每只怪物所在坐标的横坐标,以空格分割。 176 | 第二行包括n个整数y[i](-1,000,000 ≤ y[i] ≤ 1,000,000),表示每只怪物所在坐标的纵坐标,以空格分割。 177 | 178 | 179 | 输出描述: 180 | 输出一个整数表示小易最多能消灭多少只怪物。 181 | 182 | 输入例子1: 183 | 5 184 | 0 -1 1 1 -1 185 | 0 -1 -1 1 1 186 | 187 | 输出例子1: 188 | 5 -------------------------------------------------------------------------------- /wangyi-4575457/ReadMe.md: -------------------------------------------------------------------------------- 1 | [网易2017春招笔试真题编程题集合](https://www.nowcoder.com/test/4575457/summary) 2 | ==================== 3 | 4 | + 编程题1 双核处理 5 | 6 | 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。 7 | 输入描述: 8 | 输入包括两行: 第一行为整数n(1 ≤ n ≤ 50) 第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。 9 | 10 | 11 | 输出描述: 12 | 输出一个整数,表示最少需要处理的时间 13 | 示例1 14 | 输入 15 | 5 3072 3072 7168 3072 1024 16 | 输出 17 | 9216 18 | 19 | + 编程题2 赶去公司 20 | 21 | 终于到周末啦!小易走在市区的街道上准备找朋友聚会,突然服务器发来警报,小易需要立即回公司修复这个紧急bug。假设市区是一个无限大的区域,每条街道假设坐标是(X,Y),小易当前在(0,0)街道,办公室在(gx,gy)街道上。小易周围有多个出租车打车点,小易赶去办公室有两种选择,一种就是走路去公司,另外一种就是走到一个出租车打车点,然后从打车点的位置坐出租车去公司。每次移动到相邻的街道(横向或者纵向)走路将会花费walkTime时间,打车将花费taxiTime时间。小易需要尽快赶到公司去,现在小易想知道他最快需要花费多少时间去公司。 22 | 输入描述: 23 | 输入数据包括五行: 24 | 第一行为周围出租车打车点的个数n(1 ≤ n ≤ 50) 25 | 第二行为每个出租车打车点的横坐标tX[i] (-10000 ≤ tX[i] ≤ 10000) 26 | 第三行为每个出租车打车点的纵坐标tY[i] (-10000 ≤ tY[i] ≤ 10000) 27 | 第四行为办公室坐标gx,gy(-10000 ≤ gx,gy ≤ 10000),以空格分隔 28 | 第五行为走路时间walkTime(1 ≤ walkTime ≤ 1000)和taxiTime(1 ≤ taxiTime ≤ 1000),以空格分隔 29 | 30 | 31 | 输出描述: 32 | 输出一个整数表示,小易最快能赶到办公室的时间 33 | 示例1 34 | 输入 35 | 2 -2 -2 0 -2 -4 -2 15 3 36 | 输出 37 | 42 38 | 39 | + 编程题3 调整队形 40 | 41 | 在幼儿园有n个小朋友排列为一个队伍,从左到右一个挨着一个编号为(0~n-1)。其中有一些是男生,有一些是女生,男生用'B'表示,女生用'G'表示。小朋友们都很顽皮,当一个男生挨着的是女生的时候就会发生矛盾。作为幼儿园的老师,你需要让男生挨着女生或者女生挨着男生的情况最少。你只能在原队形上进行调整,每次调整只能让相邻的两个小朋友交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如: 42 | GGBBG -> GGBGB -> GGGBB 43 | 这样就使之前的两处男女相邻变为一处相邻,需要调整队形2次 44 | 输入描述: 45 | 输入数据包括一个长度为n且只包含G和B的字符串.n不超过50. 46 | 47 | 48 | 输出描述: 49 | 输出一个整数,表示最少需要的调整队伍的次数 50 | 示例1 51 | 输入 52 | GGBBG 53 | 输出 54 | 2 55 | 56 | + 编程题4 消除重复元素 57 | 58 | 小易有一个长度为n序列,小易想移除掉里面的重复元素,但是小易想是对于每种元素保留最后出现的那个。小易遇到了困难,希望你来帮助他。 59 | 输入描述: 60 | 输入包括两行: 第一行为序列长度n(1 ≤ n ≤ 50) 第二行为n个数sequence[i](1 ≤ sequence[i] ≤ 1000),以空格分隔 61 | 62 | 63 | 输出描述: 64 | 输出消除重复元素之后的序列,以空格分隔,行末无空格 65 | 示例1 66 | 输入 67 | 9 100 100 100 99 99 99 100 100 100 68 | 输出 69 | 99 100 70 | 71 | + 编程题5 魔力手环 72 | 73 | 小易拥有一个拥有魔力的手环上面有n个数字(构成一个环),当这个魔力手环每次使用魔力的时候就会发生一种奇特的变化:每个数字会变成自己跟后面一个数字的和(最后一个数字的后面一个数字是第一个),一旦某个位置的数字大于等于100就马上对100取模(比如某个位置变为103,就会自动变为3).现在给出这个魔力手环的构成,请你计算出使用k次魔力之后魔力手环的状态。 74 | 输入描述: 75 | 输入数据包括两行: 第一行为两个整数n(2 ≤ n ≤ 50)和k(1 ≤ k ≤ 2000000000),以空格分隔 第二行为魔力手环初始的n个数,以空格分隔。范围都在0至99. 76 | 77 | 78 | 输出描述: 79 | 输出魔力手环使用k次之后的状态,以空格分隔,行末无空格。 80 | 示例1 81 | 输入 82 | 3 2 1 2 3 83 | 输出 84 | 8 9 7 85 | 86 | + 编程题6 工作安排 87 | 88 | 现在有n位工程师和6项工作(编号为0至5),现在给出每个人能够胜任的工作序号表(用一个字符串表示,比如:045,表示某位工程师能够胜任0号,4号,5号工作)。现在需要进行工作安排,每位工程师只能被安排到自己能够胜任的工作当中去,两位工程师不能安排到同一项工作当中去。如果两种工作安排中有一个人被安排在的工作序号不一样就被视为不同的工作安排,现在需要计算出有多少种不同工作安排计划。 89 | 输入描述: 90 | 输入数据有n+1行: 第一行为工程师人数n(1 ≤ n ≤ 6) 接下来的n行,每行一个字符串表示第i(1 ≤ i ≤ n)个人能够胜任的工作(字符串不一定等长的) 91 | 92 | 93 | 输出描述: 94 | 输出一个整数,表示有多少种不同的工作安排方案 95 | 示例1 96 | 输入 97 | 6 012345 012345 012345 012345 012345 012345 98 | 输出 99 | 720 100 | 101 | + 编程题7 集合 102 | 103 | 小易最近在数学课上学习到了集合的概念,集合有三个特征:1.确定性 2.互异性 3.无序性. 104 | 小易的老师给了小易这样一个集合: 105 | S = { p/q | w ≤ p ≤ x, y ≤ q ≤ z } 106 | 需要根据给定的w,x,y,z,求出集合中一共有多少个元素。小易才学习了集合还解决不了这个复杂的问题,需要你来帮助他。 107 | 输入描述: 108 | 输入包括一行: 一共4个整数分别是w(1 ≤ w ≤ x),x(1 ≤ x ≤ 100),y(1 ≤ y ≤ z),z(1 ≤ z ≤ 100).以空格分隔 109 | 110 | 111 | 输出描述: 112 | 输出集合中元素的个数 113 | 示例1 114 | 输入 115 | 1 10 1 1 116 | 输出 117 | 10 118 | 119 | + 编程题8 奇怪的表达式求值 120 | 121 | 常规的表达式求值,我们都会根据计算的优先级来计算。比如*/的优先级就高于+-。但是小易所生活的世界的表达式规则很简单,从左往右依次计算即可,而且小易所在的世界没有除法,意味着表达式中没有/,只有(+, - 和 *)。现在给出一个表达式,需要你帮忙计算出小易所在的世界这个表达式的值为多少 122 | 输入描述: 123 | 输入为一行字符串,即一个表达式。其中运算符只有-,+,*。参与计算的数字只有0~9. 保证表达式都是合法的,排列规则如样例所示。 124 | 125 | 126 | 输出描述: 127 | 输出一个数,即表达式的值 128 | 示例1 129 | 输入 130 | 3+5*7 131 | 输出 132 | 56 133 | 134 | + 编程题9 涂棋盘 135 | 136 | 小易有一块n*n的棋盘,棋盘的每一个格子都为黑色或者白色,小易现在要用他喜欢的红色去涂画棋盘。小易会找出棋盘中某一列中拥有相同颜色的最大的区域去涂画,帮助小易算算他会涂画多少个棋格。 137 | 输入描述: 138 | 输入数据包括n+1行: 139 | 第一行为一个整数n(1 ≤ n ≤ 50),即棋盘的大小 140 | 接下来的n行每行一个字符串表示第i行棋盘的颜色,'W'表示白色,'B'表示黑色 141 | 142 | 143 | 输出描述: 144 | 输出小易会涂画的区域大小 145 | 示例1 146 | 输入 147 | 3 BWW BBB BWB 148 | 输出 149 | 3 150 | 151 | + 编程题10 小易记单词 152 | 153 | 小易参与了一个记单词的小游戏。游戏开始系统提供了m个不同的单词,小易记忆一段时间之后需要在纸上写出他记住的单词。小易一共写出了n个他能记住的单词,如果小易写出的单词是在系统提供的,将获得这个单词长度的平方的分数。注意小易写出的单词可能重复,但是对于每个正确的单词只能计分一次。 154 | 输入描述: 155 | 输入数据包括三行: 156 | 第一行为两个整数n(1 ≤ n ≤ 50)和m(1 ≤ m ≤ 50)。以空格分隔 157 | 第二行为n个字符串,表示小易能记住的单词,以空格分隔,每个单词的长度小于等于50。 158 | 第三行为m个字符串,系统提供的单词,以空格分隔,每个单词的长度小于等于50。 159 | 160 | 161 | 输出描述: 162 | 输出一个整数表示小易能获得的分数 163 | 示例1 164 | 输入 165 | 3 4 apple orange strawberry strawberry orange grapefruit watermelon 166 | 输出 167 | 136 168 | 169 | + 编程题11 堆砖块 170 | 171 | 小易有n块砖块,每一块砖块有一个高度。小易希望利用这些砖块堆砌两座相同高度的塔。为了让问题简单,砖块堆砌就是简单的高度相加,某一块砖只能使用在一座塔中一次。小易现在让能够堆砌出来的两座塔的高度尽量高,小易能否完成呢。 172 | 输入描述: 173 | 输入包括两行: 第一行为整数n(1 ≤ n ≤ 50),即一共有n块砖块 第二行为n个整数,表示每一块砖块的高度height[i] (1 ≤ height[i] ≤ 500000) 174 | 175 | 176 | 输出描述: 177 | 如果小易能堆砌出两座高度相同的塔,输出最高能拼凑的高度,如果不能则输出-1. 保证答案不大于500000。 178 | 示例1 179 | 输入 180 | 3 2 3 5 181 | 输出 182 | 5 183 | 184 | + 编程题12 分饼干 185 | 186 | 易老师购买了一盒饼干,盒子中一共有k块饼干,但是数字k有些数位变得模糊了,看不清楚数字具体是多少了。易老师需要你帮忙把这k块饼干平分给n个小朋友,易老师保证这盒饼干能平分给n个小朋友。现在你需要计算出k有多少种可能的数值 187 | 输入描述: 188 | 输入包括两行: 189 | 第一行为盒子上的数值k,模糊的数位用X表示,长度小于18(可能有多个模糊的数位) 190 | 第二行为小朋友的人数n 191 | 192 | 193 | 输出描述: 194 | 输出k可能的数值种数,保证至少为1 195 | 示例1 196 | 输入 197 | 9999999999999X 3 198 | 输出 199 | 4 --------------------------------------------------------------------------------