- 博客(85)
- 收藏
- 关注
原创 牛客网,华为研发工程师编程题,3道
第一题:汽水瓶换汽水#include<bits/stdc++.h>using namespace std;int res=0;int main(){ int bottle=0; int drink=0; while(cin>>bottle){ if(bottle==0) break; drink=0; while(bottle>=3){
2022-04-02 18:41:16
673
原创 牛客网输入输出练习,stringstream
stringgetline(cin,str)getline(cin,str); 处理后还留有结束符在输入流中,故需要使用cin.get();接受最后一个结束符,才能接受后面得输入值。两个函数返回值都会丢弃换行符。getline(cin,str)的读取原理是将以‘\n’ 为结束符完整读取的一行,’\n’回车,所以当之前用cin读取一个字符串的时候输入函数getline(cin,str) 与cin.getline(str,int)的区别[C/C++]#include<bits/stdc++.h
2022-03-21 15:53:04
895
原创 C++ sort()用法
#include<iostream>#include<vector>#include <algorithm>using namespace std;bool cmp(string x,string y){ return x<y;}int main(){ int n; vector<string> res; string temp; cin>>n; while(n>0){.
2022-03-18 21:06:30
1074
原创 C++ cin,cin.get(),cin.getline等使用
参考以下博客,用于个人学习归纳C/C++中cin、scanf、cin.get()、cin.getline()、getline()、getchar()、gets()空格回车换行符对其的影响cincin从第一个非空白字符开始读取,到空白字符停止,换行符会被留在缓冲区scanf输出 a+回车scanf读取字符,可以读取空格或者换行符。额外的换行符保留在缓冲区,在本程序中,换行符被cin.get(b)赋值给了b。scanf可以读取C风格的字符串(字符数组),也可以读取C++风格的字符串(strin
2022-03-18 16:44:12
1146
原创 剑指68:二叉搜索树的最近公共祖先,k个子节点
方法一:逐个比较节点/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: TreeNode* res; b
2022-03-14 17:18:32
243
原创 剑指59:队列的最大值
方法一:利用大顶堆进行排序,再设置一个延迟删除大顶堆(保存删除值,直到下一次查询最大值再从大顶堆里弹出)class MaxQueue {public: priority_queue<int,vector<int>,less<int>> maxq,delq; //排序队列,延时删除队列 queue<int> q; //基本队列 MaxQueue() { } int max_value() {
2022-03-10 21:12:14
167
原创 剑指53:0~n-1中缺失的数字,二分搜索
class Solution {public: int missingNumber(vector<int>& nums) { int l=0; int r=nums.size()-1; int mid; //if(nums[0]==1) // return 0; //if(nums[r]==r) // return r+1; while(l
2022-03-08 16:05:29
152
原创 剑指53:在排序数组中查找数字 1
class Solution {public: int search(vector<int>& nums, int target) { int length=nums.size(); int x=0; if(length==0 || target<nums[0] || target>nums[length-1]) return 0; x=binarysearch(nums,tar
2022-03-08 15:23:30
281
原创 剑指48:最长不含重复字符的子字符串
class Solution {public: int lengthOfLongestSubstring(string s) { if(s.size()<=1) return s.size(); unordered_map<char,int> hashmap; // hashmap里存放的是上一次遇到该字符的位置 int left=-1; int res=0;
2022-03-07 22:02:25
157
原创 剑指46:把数字翻译成字符串
方法一:动态规划dp首先把数字num转为字符串string,方便操作根据递推公式当长度为i的字符串s,若s[i-1]和s[i]能表示字母,则说明 s[i-1] s[i]表示的数字在 [10,25]所以dp[i]=dp[i-2]*1+dp[i-1]*1;其中dp[i-1]是单个表示的情况,dp[i-2]是两个数字表示一个字母的情况若s[i-1]和s[i]不能表示一个字母,则dp[i]=dp[i-1]*1当存放数字的字符串长度为1时,无论如何只能有一种表示方法,长度为2时,若s[1] s[0]
2022-03-07 17:31:13
406
原创 关闭windows自动更新(附软件)
软件文件如下:64位系统使用x64尾缀的,建议使用管理员权限运行软件界面如下:链接:https://pan.bai去掉du.com/s/1N_feJJbWx去掉mtLVIXb去掉CLgjzg?pwd=czst提取码:czst
2022-03-07 11:45:57
263
原创 剑指47:礼物的最大价值
方法一:基本的dfs,没有剪枝,会超时class Solution {public: int res; int row; int col; int maxValue(vector<vector<int>>& grid) { row=grid.size(); col=grid[0].size(); res=grid[0][0]; dfs(grid,0,0,0);
2022-03-07 11:33:45
652
原创 剑指45:把数组排成最小的数,重要
重点:字符串的排序,自定义排序方式,快排sort(strs.begin(),strs.end(),[](string& x,string& y){return x+y<y+x;});class Solution {public: string minNumber(vector<int>& nums) { //字符串,自定义排序规则 vector<string> strs; string res
2022-03-06 22:35:37
222
原创 剑指52:两个链表的第一个公共节点
方法一:朴素解法,双层循环,遍历比较两个链表节点是否相同(注意不是值相等)方法二:将两个链表分别入栈,均到达链表尾后,开始出栈,并比较是否相同,若相同则继续分别出栈,继续比较是否相同;若不相同,则上一次比较的节点是第一个公共节点(即当前比较的两个节点的next)方法三:先分别计算两个链表长度a和b(假设a>b),算出长度差a-b,长链表先走a-b步,然后两个链表开始比较若相同,则该节点是第一个公共节点,返回结果;若不相同,两个链表分别向后走一步,继续比较。方法四:利用集合set
2022-03-06 17:35:44
242
原创 剑指44:数字序列中的某一位数
class Solution {public: int findNthDigit(int n) { long start=1; int num=1; int digit=1; long count=9; while(n>count){ n=n-count; digit++; start=start*10; count
2022-03-06 16:49:56
187
原创 剑指42:连续子数组的最大值,DP
DPclass Solution {public: int maxSubArray(vector<int>& nums) { //DP,无后效性 int res=nums[0]; int dp=nums[0]; for(int i=1;i<nums.size();i++){ dp=max(nums[i],dp+nums[i]); res=max(re
2022-03-06 00:22:59
76
原创 剑指40:最小k个数
class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { quicksort(arr,0,arr.size()-1); vector<int> res; res.assign(arr.begin(),arr.begin()+k);//assign实现不同容器赋值 return res;
2022-03-05 20:40:06
149
原创 剑指38:字符串的排列,需要再刷
class Solution {public: vector<string> permutation(string s) { dfs(s, 0); return res; }private: vector<string> res; void dfs(string s, int x) { if(x == s.size() - 1) { //当到达最后一个字符,那么没有可交换的字符,返回
2022-03-05 20:21:24
61
原创 剑指34:二叉树中和为某一值的路径
class Solution {public: vector<vector<int>> ans; vector<int> temp; vector<vector<int>> pathSum(TreeNode* root, int target) { if(root==nullptr) return {}; pathsearch(target,root);
2022-03-04 11:03:10
96
原创 剑指33:二叉搜索树的后序遍历
错误方法:class Solution {public: vector<int> temp; bool verifyPostorder(vector<int>& postorder) { return posthelper(postorder,0,postorder.size()-1); } bool posthelper(vector<int>& postorder,int l,i
2022-03-03 22:00:41
602
原创 for(int x:nums),在循环中改变nums元素的情况
首先结果:会改变循环赋值,即xclass Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> num={1,2,3,4,5}; for(int e:num){ if(e==3) num[3]=9; } return num;
2022-03-03 18:21:53
3263
原创 剑指31:栈的压入,弹出序列
思路:利用pushed数组作为栈来使用,在未弹出的值后一位作为栈顶妙class Solution {public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { int i = 0, j = 0; for (int e : pushed) { //是按地址来进行元素赋值,每次循环后地址+1 pushe
2022-03-03 17:13:39
128
原创 剑指29:顺时针打印矩阵
class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if(matrix.empty()) return {}; int row=matrix.size(); int col=matrix[0].size(); int i=0; int t=0,b=
2022-03-03 12:36:34
83
原创 剑指35:复杂链表的复制
一开始题目其实不是很好理解,本题的主要考点就是复制后的随机指针指向的节点可能还未生成,此时该如何去处理思路:方法一:先按cur->next把所有链表节点全部遍历并复制生成新节点,利用哈希表保存,然后再按对应key赋值random指针。/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val) { va
2022-02-28 11:40:09
241
原创 剑指25:合并两个排序的链表
方法一:双指针,比较两节点val大小,然后连接到ans链表后class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* ans=new ListNode(0); //这个新建一个节点,可以有效简化判断开头节点的步骤 ListNode* p=ans; //在输出结果时输出ans->next if(l1==nullptr)
2022-02-27 10:23:12
497
原创 剑指24:反转链表
反转链表的关键是要保存前后节点,先用right指针保存当前节点的下一节点,反转时当前节点指向左节点,然后为下一次反转做准备,left=cur,cur=rightclass Solution {public: ListNode* reverseList(ListNode* head) { ListNode* left=nullptr; ListNode* cur=head; ListNode* right; while(cur!
2022-02-25 21:33:08
402
原创 剑指21:调整数组顺序使奇数位于偶数前面
方法一:双指针,左指针从左往右搜索偶数,右指针从右往左搜索奇数,然后交换。class Solution {public: vector<int> exchange(vector<int>& nums) { int length=nums.size(); int left=0; int right=length-1; int temp; while(left<right){
2022-02-25 19:51:47
194
原创 剑指22:链表中倒数第k个节点
方法一先遍历整个链表,得到链表长度n,然后返回第n-k位即为倒数k位时间复杂度O(2n-k)=O(n)方法二双指针法,fast=slow+k-1,若fast指向链表末尾后一位即nullptr,则此时slow正好在链表倒数第k位,返回slow即为所求时间复杂度O(n)class Solution {public: ListNode* getKthFromEnd(ListNode* head, int k) { if(head==nullptr )
2022-02-25 17:17:26
352
原创 剑指18:删除链表的节点
简单题,主要就是一个链表操作删除链表节点可按位置分为以下几种情况:1,要删除的节点在链表头,那么直接返回head->next,即去掉表头,返回后一个节点2,要删除的节点在链表中间,那么就需要一个指针保存前一个节点,将前一个节点的next指向要删除节点的后一个节点,即pre->next=cur->next3,要删除的节点在链表末尾,情况基本等同于在链表中间4,链表中找不到要删除的节点,那么由于循环条件,链表指针会指向链表末尾后一位,cur指针会指向空,也不需要在链表中删除节点,但要
2022-02-25 10:28:29
2671
原创 剑指16:数值的整数次方,快速幂
class Solution {public: double myPow(double x, int n) { if(x==0) return 0.0; long p=n; //由于int范围为-2^31~2^31-1,最小值取反后超过int范围(否则直接负数幂不好求),所以用long double ans=1.0; if(n<0){ p=-p; //不能p=-n
2022-02-25 10:12:46
89
原创 leetcode 717:1比特与2比特字符
class Solution {public: bool isOneBitCharacter(vector<int>& bits) { int length=bits.size(); int n=0; int flag=0; while(n<length-1){ if(bits[n]==0){ flag=0; }
2022-02-20 22:05:04
160
原创 剑指15:二进制中1的个数
方法一:将1左移i次,与n按位与,如果结果不为0,说明该位是1,遍历32位class Solution {public: int hammingWeight(uint32_t n) { int res=0; for(int i=0;i<32;i++){ if(n&(1<<i)) res++; } return res; }};方法二:n与
2022-02-20 20:15:31
128
原创 剑指12:矩阵中的路径
思路:1,为了避免重复结果同一个元素,可以匹配正确该元素后把该位置赋空字符\0,但是要在其他路径搜索前恢复该字符。2,匹配正确一个元素后,最多有四个方向可能有解,但是要考虑矩阵边界。3,由于不需要返回具体路线,所以可以根据设置标志位来判断剪枝操作。看了思路以后写出,要复习巧妙的一点是利用回溯法,同时搜索和返回了res,需要注意的是在下一个路径开始前要还原字符。class Solution {public: int col,row; bool exist(vector<v
2022-02-17 21:47:25
200
原创 剑指10:旋转数组最小值
思路:1,把数组看为两部分,A部分一定大于等于B部分,因此要判断最小值范围应该拿最右边值来作为对照。2,二分法取中间值来判断,(1)如果mid>right,说明mid此时在A部分,不可能是最小值,最小值范围可以缩小到[mid+1,right];(2)如果mid<rihgt,说明mid此时在B部分,且不会在最右端,此时mid是已经发现的最小值(可能为答案),可以把right缩小到mid位置,最小值范围为[left,mid](3)当mid=right,有多种情况,一种是mid在A部分,ri
2022-02-17 00:21:07
343
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
13