普通版 剑指 Offer 浅刷浅刷( 五 )


这种题还得看大佬的题解,哎嘘,人麻了 。
剑指 Offer 20. 表示数值的字符串
class Solution {public:bool isNumber(string s) {bool isvalid = false; //初始认为这个字符串不表示数值int dot_C = 0; //记录小数点出现的次数int E_C = 0; //记录e出现的次数int i= 0; //字符串s的下标//过滤字符串前面部分的空格while (s[i] == ' ') {i++;}//如果第一个不为空格的字符是符号,下标自增跳过if (s[i] == '+' || s[i] == '-') {i++;}//遍历for ( ; i < s.size(); i++) {//出现数字,认为是数值if (s[i] >= '0' && s[i] <= '9') {isvalid = true;continue;}//出现小数点if (s[i] == '.') {//小数点只能出现一次,并且要在e出现之前,若不符合返回falseif (dot_C < 1 && E_C < 1) {dot_C++;continue;} else {return false;}}//出现eif (s[i] == 'e' || s[i] == 'E') {//e只能出现一次,并且e出现之前必须满足数值要求(是一个合法的整数或者小数) 。if (E_C < 1 && isvalid) {E_C++;} else {return false;}//同时e的后面至少能够存放一个字符,如果越界返回falseif (i + 1 .size()) {//可能会出现符号,如果是符号,下标自增跳过if (s[i + 1] == '+' || s[i + 1] == '-') {i++;}//需要重新判断e后面是否合法isvalid = false;continue;}return false;}//第二次出现空格,需要判断空格是否一直出现到字符串结束while (s[i] == ' ') {i++;}//如果空格一直到字符串末尾,返回结果if (i >= s.size()) {return isvalid;}//不符合上述所有情况,说明这肯定不是一个合法的数值return false;}//字符串遍历结束,返回结果return isvalid;}};
这题做着真没啥意思,无聊的很,没有技术含量,纯纯脑瘫题,就记录灭次的状态就行了 。
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
class Solution {public:vector exchange(vector& nums) {int start = 0, end = nums.size() - 1;while (start < end) {while (nums[start] % 2 == 1 && start < end) {start++;}while (nums[end] % 2 == 0 && start < end) {end--;}if (start < end) {//能到这一定就是左指偶数右指奇数了,要么就是超界了int t = nums[start];nums[start] = nums[end];nums[end] = t;}}return nums;}};
双指针而已,左右开工,左找到偶数,右找到奇数,直接交换就over 。
剑指 Offer 22. 链表中倒数第k个节点
/*** Definition for singly-linked list.* struct ListNode {*int val;*ListNode *next;*ListNode(int x) : val(x), next(NULL) {}* };*/class Solution {public:ListNode* getKthFromEnd(ListNode* head, int k) {ListNode *fast = head;ListNode *slow = head;while (fast) {if (k) {k--;} else {slow = slow->next;}fast = fast->next;}return slow;}};
两个指针,一个快一个慢,让快的先走k次,然后慢的再开始,等快的走完了,慢的就是返回节点的位置了 。
剑指 Offer 24. 反转链表
/*** Definition for singly-linked list.* struct ListNode {*int val;*ListNode *next;*ListNode(int x) : val(x), next(NULL) {}* };*/class Solution {public:ListNode* reverseList(ListNode* head) {ListNode *newHead, *rear, *temp;newHead = head;rear = NULL;temp = NULL;while (newHead) {temp = newHead->next;newHead->next = rear;rear = newHead;newHead = temp;}return rear;}};
经典的三指针联动,一个指向下一个(temp),一个指向尾(rear),再加个中间操作变量(),使用一个while循环直到链表完了就行 。每次让指向下一个的(temp)先跳到下一个,然后再将的next赋值为前一个rear地址,最后跳向temp,rear跳向一直循环就完成了 。
剑指 Offer 25. 合并两个排序的链表