剑指 Offer 58-II左旋转字符串
思路还是遍历,先遍历k到strlen(s)的,放到res里,之后再把0到k的接在后面就ok了 1234567891011121314151617char* reverseLeftWords(char* s, int n) { int len = strlen(s); char* res = (char*)malloc(len + 1); int index = 0; for (int i = n; i < len; i++) { res[index++] = s[i]; } // 将前 n 个字符添加到 res for (int i = 0; i < n; i++) { res[index++] = s[i]; } res[index] = '\0'; return res;}
剑指 Offer 05.替换空格
思路8多说,直接遍历 12345678910111213141516char* str(char*s){ int len=strlen(s); char *res=(char *)malloc(2*len+1); int j=0; for(int i=0;i<len;i++){ if(s[i]==' '){ res[j++] = '%'; res[j++] = '2'; res[j++] = '0'; }else{ res[j++]=s[i]; } } res[j]='\0'; return res;}
1047.删除字符串中所有相邻重复相
思路经过第239题的洗礼,这道题似乎变得轻而易举,我们直接用一个栈来实现,依次把每个数扔进去,当下一个数与这个数一样的时候,直接top–,并且不输入到栈中,不一样的时候,丢入栈中 代码如下: 12345678910111213141516char* removeDuplicates(char* s) { int len = strlen(s); char* stack = (char*)malloc(2 * len + 1); int top = 0; for (int i = 0; i < len; i++) { if (top > 0 && stack[top - 1] == s[i]) { top--; } else { stack[top++] = s[i]; } } stack[top] = '\0'; return...
239.滑动窗口最大值
思路这题解的思路真的很巧妙,它使用了单调队列(满足单调性的双端队列),也就是它可以从队头或队尾插入或删除,并且他是从大到小排的 它的代码也没有多复杂,用数组就可以实现 先定义一个下标数组q ,用来存储下标方便后面操作,还有一个结果数组,用来return结果,不难通过观察发现结果的数量为numsSize-k+1 123int q[numsSize];*returnSize=0;int *ans=malloc(sizeof(int)*(numsSize-k+1)); 在来两个指针left和right指向他的头和尾 1int left=0;int right=0; 开始: 我们先把nums里的数的下标开始一位一位的存进去,循环k次,如果后面的比前面的大,把前面的移除,来保证num[q[left]]一定是最大的从而保证递减性 12345!!! 如何移除: 当q不为空,并且nums[q[right]]<nums[i] 我们直接让right-- 然后再看...
232.用栈实现队列
思路这个就比用队列实现栈简单了 需要两个栈,一个用来接收,一个用来弹出,当弹出栈有东西时,优先弹出,当弹出栈空时,再把接受栈的给弹出栈 代码: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384#define LEN 20typedef struct{ int* data; int top; int size;}Stack;typedef struct { Stack* stack1,*stack2;} MyQueue;Stack* initStack(int k){ Stack*obj=(Stack*)malloc(sizeof(Stack)); ...
225.用队列实现栈
思路不是非常熟练,这里就用一种简单的,用两个队列来辅助实现栈 对于队列: 1231. 用head==rear==-1,来判断队列是否为空2. 入队列的时候,如果为空先把head置为0,用循环队列表示,rear=(rear+1)%size;3. 出队列的时候是吧head出出来, head=(head+1)%size; 对于双队列表示栈: 11....
150.逆波兰表达式求值
思路 一个好用的函数 123456789#include <stdlib.h>int atoi(const char *str); const char *numStr = "1234"; int num = atoi(numStr); // 将字符串转换为整数 printf("转换后的整数是: %d\n", num); // 输出: 转换后的整数是: 1234 自己写的笨比算法 123456789101112131415161718192021222324252627282930313233343536int evalRPN(char** tokens, int tokensSize) { int stack[tokensSize]; int top = -1; for (int i = 0; i < tokensSize; i++) { // 判断是否是加号 if (strcmp(tokens[i], "+") == 0)...
20.有效的括号
有效的括号 很经典的一道栈题 只要遍历字符串s,是左括号就放入栈,是右括号就弹出,不匹配或者空栈就false 代码: 1234567891011121314151617181920212223242526272829char pairs(char a){ if(a==')') return '('; if(a=='}') return '{'; if(a==']') return '['; return 0;}bool isValid(char* s) { int n=strlen(s); if(n%2==1){ return false; } int stack[n+1],top=0; for(int i=0;i<n;i++){ char ch=pairs(s[i]); ...
707.设计链表
707. 设计链表做了这么多链表题,还是得要自己会写链表 这题题目已经自带 1234struct ListNode{ int val; struct ListNode* next;} 代码: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576typedef struct { struct ListNode* head; int size;} MyLinkedList;struct ListNode* ListNodeCreat(int val){ struct ListNode* node=(struct ListNode*)malloc(sizeof(struct ListNode)); node->val=val; ...
160.相交链表
哈希手感来了,自己用哈希写了一个,记录一下 12345678910111213141516171819202122232425262728293031323334353637383940414243struct hashTable{ struct ListNode* key; int val; UT_hash_handle hh;};struct hashTable* hashtable;struct hashTable* find(struct ListNode* ikey){ struct hashTable* tmp; HASH_FIND_PTR(hashtable,&ikey,tmp); return tmp;}void insert(struct ListNode*ikey,int ival){ struct hashTable* it=find(ikey); if(it==NULL){ struct hashTable*...







