你未必出类拔萃,但一定与众不同

剑指 Offer 17-21

文章目录

  • 剑指 Offer 17-21
    • 剑指 Offer 17. 打印从1到最大的n位数
    • 字符串模拟数字加法(解决大数问题)
    • 剑指 Offer 18. 删除链表的节点
    • 剑指 Offer 19. 正则表达式匹配
    • 剑指 Offer 20. 表示数值的字符串
    • 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

剑指 Offer 17. 打印从1到最大的n位数

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

思路:

输入的n位数 为10的n次平方

然后循环求解

还有个字符串求解大数的问题

class Solution {public int[] printNumbers(int n) {if(n == 0){return null;}int[] array = new int[(int) Math.pow(10,n)-1];for (int i = 0; i < array.length; i++) {array[i] = i + 1;}return array;}
}

字符串模拟数字加法(解决大数问题)

字符串表示数字的时候,字符串里每个字符都是 ‘0’ - ‘9’之间的某个字符,表示数字的一位,一位数字最大是n位,因此需要一个长度为n + 1的字符串

static void maxStringToShuZi(int n){if(n <= 0){return;}char[] number = new char[n+1];//首先把字符串中每个数字都初始化为 ‘0’for (int i = 0; i < number.length; i++) {number[i] = '0';}//increment方法负责在字符串上增加1while(!increment(number)){//打印printNumber(number);}}/*** 判断是不是已经到了最大的n位数  到达就停止* @param number* @return*/static boolean increment(char[] number){boolean overFlow = false;int takeOver = 0;int length = number.length;for (int i = length-1; i >= 0; i--) {int nSum = number[i] - '0' + takeOver;if(i == length-1){nSum++;}if(nSum >= 10){if(i == 0){overFlow = true;}else{nSum -= 10;takeOver = 1;number[i] = (char) ('0' + nSum);}}else{number[i] = (char) ('0' + nSum);break;}}return overFlow;}/*** 数字不够n位时 ,在数字前面补0 打印的时候则不能打印出来* 只有碰到第一个非0的数字才开始打印  直到数组的结尾* @param number*/static void printNumber(char[] number){boolean beginNumber = true;int length = number.length;for (int i = 0; i < number.length; ++i) {if(beginNumber && number[i] != '0'){beginNumber = false;}if(!beginNumber){System.out.print(number[i]);}}System.out.print("\t");}

剑指 Offer 18. 删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof

遍历整个链表 遇到匹配的值 则进行删除

通过快慢指针完成

class Solution {public ListNode deleteNode(ListNode head, int val) {if(head.val == val) return head.next;ListNode pre = head, cur = head.next;while(cur != null && cur.val != val) {pre = cur;cur = cur.next;}if(cur != null) pre.next = cur.next;return head;}
}

剑指 Offer 19. 正则表达式匹配

请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof

public static  boolean isMatch(String s, String p) {int m = s.length() + 1, n = p.length() + 1;boolean[][] dp = new boolean[m][n];dp[0][0] = true;// 初始化首行for(int j = 2; j < n; j += 2) {dp[0][j] = dp[0][j - 2] && p.charAt(j - 1) == '*';System.out.println(dp[0][j]);}// 状态转移for(int i = 1; i < m; i++) {for(int j = 1; j < n; j++) {if(p.charAt(j - 1) == '*') {if(dp[i][j - 2]) {dp[i][j] = true;} else if(dp[i - 1][j] && s.charAt(i - 1) == p.charAt(j - 2)) {dp[i][j] = true;} else if(dp[i - 1][j] && p.charAt(j - 2) == '.') {dp[i][j] = true;}} else {if(dp[i - 1][j - 1] && s.charAt(i - 1) == p.charAt(j - 1)) {dp[i][j] = true;} else if(dp[i - 1][j - 1] && p.charAt(j - 1) == '.') {dp[i][j] = true;}}}}for (int i = 0; i < dp.length; i++) {for (int j = 0; j < dp[0].length; j++) {System.out.print(dp[i][j]+"   ");}System.out.println();}return dp[m - 1][n - 1];}

剑指 Offer 20. 表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

数值(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. 一个 小数 或者 整数
  3. (可选)一个 'e''E' ,后面跟着一个 整数
  4. 若干空格

小数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+''-'
  2. 下述格式之一:
    1. 至少一位数字,后面跟着一个点 '.'
    2. 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
    3. 一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+''-'
  2. 至少一位数字

这道题 是有那么恶心… 情况比较多 当时自己的是过了1217个用例 但是总共1400个用例

public static boolean isNumber(String s) {String string = s.replaceAll(" ","");if(string.length() == 0){return false;}char[] str= string.toCharArray();if(str.length == 1 && !Character.isDigit(str[0])){return false;}if(str[0] == 'E' || str[0] == 'e' || str[str.length -1] == 'E' ||str[str.length -1] == 'e'){return false;}for (int i = 0; i < str.length; i++) {if(i + 1 < str.length && (str[i] == '+' || str[i] == '-')  && !Character.isDigit(str[i + 1])){return false;}if(i + 1 < str.length && str[i] ==  '.' && !Character.isDigit(str[i + 1])){return false;}if(i - 1 > 0 && (str[i] ==  'E' || str[i] == 'e') && !Character.isDigit(str[i - 1])){return false;}}return true;}

过了全部用例的正确求解

public boolean isNumber(String s) {// 字符数组char[] charArray = s.toCharArray();// 字符串长度int n = charArray.length;// 当前下标int index = 0;// 标记boolean hasNum = false, hasE = false;boolean hasSign = false, hasDot = false;// 将下标移动到非空格字符上while (index < n && charArray[index] == ' ') {index++;}// 当前下标尚未到达字符串末尾while (index < n) {// 当前字符char c = charArray[index];if (c >= '0' && c <= '9') {// 当前字符是数字 0~9hasNum = true;} else if (c == 'e' || c == 'E') {// 当前字符是 e / Eif (hasE || !hasNum) {// e / E 已经出现过,或者数字没有出现过,则该字符串必定无法表示数值,返回 falsereturn false;}hasE = true;hasNum = false;hasSign = false;hasDot = false;} else if (c == '+' || c == '-') {// 当前字符是正负号if (hasSign || hasNum || hasDot) {// 如果已经出现过符号、数字、小数点,则该字符串必定无法表示数值,返回 falsereturn false;}hasSign = true;} else if (c == '.') {// 如果是小数点if (hasDot || hasE) {// 如果已经出现过小数点、e / E ,则该字符串必定无法表示数值,返回 falsereturn false;}hasDot = true;} else if (c == ' ') {// 如果是空格,跳出循环break;} else {// 非法字符return false;}// 继续判断下一个字符index++;}// 如果当前下标尚未到达字符串末尾,则剩下的字符应当全部为空格,否则该字符串必定无法表示数值,返回 falsefor (; index < n; index++) {if (charArray[index] != ' ') {return false;}}return hasNum;}

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof

思路:

采用双指针 左指针和右指针

分别针对

  • 左指针为奇数 右指针为偶数 左指针移动
  • 左指针为奇数 右指针为偶数 一起移动
  • 左指针为偶数 右指针为奇数 交换
  • 左指针为偶数 右指针为偶数 右指针移动
class Solution {public static int[] exchange(int[] nums) {if(nums.length == 0){return new int[]{};}int left = 0;int right = nums.length - 1;while(left < right) {//左指针为奇数     右指针为奇数if((nums[left] & 1) == 1 && (nums[right] & 1) == 1) {left ++ ;}//左指针为奇数     右指针为偶数if((nums[left] & 1) == 1 && (nums[right] & 1) != 1) {left ++ ;right--;}//左指针为偶数   右指针为奇数   交换if(left < right && (nums[left] & 1) != 1 && (nums[right] & 1) == 1) {int temp = nums[left];nums[left] = nums[right];nums[right] = temp;right--;left++;}//左指针为偶数 右指针为偶数if((nums[left] & 1) != 1 && (nums[right] & 1) != 1) {right--;}}return nums;}
}

剑指 Offer17-21相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java

    <LeetCode力扣练习>剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java 一.资源 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组 ...

  2. 【LeetCode】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    [LeetCode]剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 文章目录 [LeetCode]剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 一.双指针 一.双指针 解题思路: ...

  3. 【双100%解法】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    立志用最少的代码做最高效的表达 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4] 输 ...

  4. Leetcode 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 (每日一题 20210917)

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.示例:输入:nums = [1,2,3,4] 输出:[1,3,2,4] 注:[3,1 ...

  5. 剑指offer(21):栈的压入、弹出序列

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应 ...

  6. 【算法】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    文章目录 1.概述 2,双指针 1.概述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分. 示例: 输入:nums = [1,2,3,4 ...

  7. 剑指offer——21.调整数组顺序使奇数位于偶数前面

    题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 知识点: 保证相对位置 ...

  8. 剑指offer-17.合并两个排序的链表

    https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337?tpId=13&tqId=11169&tPage= ...

  9. 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 (快速排序partion操作应用)

    借助一个额外的空间,空间复杂度O(N), 时间复杂度O(1) 快速排序partion操作,空间O(1),  不稳定 冒泡排序,O(n^2), 空间O(1) class Solution { publi ...

  10. LeetCode-剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 思路一:使用快慢双指针 1: i找偶数找到了,继续往下执行,找不到i++ 2:j找奇数,找到了继续往下执行,找不到j– 3:最后交换 clas ...

最新文章

  1. 在objective-c / cocoa中抛出异常
  2. 【PMP】项目风险管理~重点知识
  3. 老齐python-基础3(列表)
  4. IOS之学习笔记二(块)
  5. Cocos Creator 编辑器扩展
  6. 【优化算法】鼠群优化算法(RSO)【含Matlab源码 1462期】
  7. 什么是MIME类型?
  8. IDEA怎么换背景颜色
  9. Postman 接口测试神器
  10. 使用tree生成目录树结构
  11. 服务器提取用户信息,获取客户端和服务器信息
  12. 最长对称子串 作者 陈越单位 浙江大学
  13. IRC(Internet Relay Chat)(因特网中继聊天)协议——RFC1459文档要点总结
  14. Delivering Smiles:亚马逊的温暖进行时
  15. 微信支付获取prepay_id以及回调地址
  16. UE4-(反射)平面反射
  17. 关于标准ASCII编码表中:数字、小写英文字母和大写英文字母的前后次序
  18. 为解决Win10更新后扬声器和麦克风失效作出的一些尝试
  19. 如何开发一个药房药店小程序?药店小程序需要什么资质?
  20. #6543. 大葱的神谕(杜教筛)

热门文章

  1. 孔乙己——纪念当今的穷酸大学生们
  2. 图像拼接(十一):双摄像头实时拼接+stitching_detailed
  3. LIKE语句通配符:%|_|[]
  4. Oracle 回收站功能
  5. docker inspect container_name | grep Mounts -A 20
  6. JMM可见性内存模型
  7. 企业微信和个人微信在朋友圈上有何区别?
  8. wifi卡慢延迟高_家中无线突然很慢/卡顿怎么办?路由器增强WiFi信号的几种方法...
  9. 【收藏版】Linux常用命令大全
  10. 福建师范大学计算机科学专业,福建师范大学计算机科学与技术专业在哪个校区...