LeetCode100道 day02

97 阅读2分钟

LeetCode100道 day02

1. 寻找两个正序数组的中位数

  • 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数 组的 中位数 。

  • 算法的时间复杂度应该为 O(log (m+n)) 。

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {



        int[] nums3=new int[nums1.length+nums2.length];
        for (int i = 0; i <nums1.length; i++) {
            nums3[i]=nums1[i];
        }
        for (int i = 0; i <nums2.length; i++) {
            nums3[nums1.length+i]=nums2[i];
        }
        Arrays.sort(nums3);
        double cc=nums3.length %2;
        if(cc==0){
            double a=nums3.length/2-1;
            Integer k=(int)a;

            double  b=nums3.length/2;
            Integer v=(int)b;
         double ddd=(nums3[k]+nums3[v]);

           return (ddd/2);
        }else {
           double c=nums3.length/2;
           Integer pp =(int)(c+0.5);
          return nums3[pp];
        }
}
}

2. 最长回文子串

  • 给你一个字符串 s,找到 s 中最长的回文子串。
class Solution {
   public String longestPalindrome(String s) {
 if (s == null || s.length() == 0) {
           return "";
       }
//         保存起始位置,测试了用数组似乎能比全局变量稍快一点
       int[] range = new int[2];
       char[] str = s.toCharArray();
       for (int i = 0; i < s.length(); i++) {
//             把回文看成中间的部分全是同一字符,左右部分相对称
//             找到下一个与当前字符不同的字符
           i = findLongest(str, i, range);
       }
       return s.substring(range[0], range[1] + 1);
   }
   
   public static int findLongest(char[] str, int low, int[] range) {
//         查找中间部分
       int high = low;
       while (high < str.length - 1 && str[high + 1] == str[low]) {
           high++;
       }
//         定位中间部分的最后一个字符
       int ans = high;
//         从中间向左右扩散
       while (low > 0 && high < str.length - 1 && str[low - 1] == str[high + 1]) {
           low--;
           high++;
       }
//         记录最大长度
       if (high - low > range[1] - range[0]) {
           range[0] = low;
           range[1] = high;
       }
       return ans;
   }
   }


3. Z 字形变换

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

 

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"

示例 2:

输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

输入: s = "A", numRows = 1
输出: "A"

 

提示:

  • 1 <= s.length <= 1000
  • s 由英文字母(小写和大写)、',' 和 '.' 组成
  • 1 <= numRows <= 1000
  • 这道题花费了一些时间没解出来,看题解顿有所悟,希望多加练习吧
class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows==1) return s; //如果它的字符串只有一行那么就直接返回字符串s;
        vector<string>rows(numRows); //存放每行字符串的数组
        int flag=1; //转向的标志  等于1时从上往下遍历  等于-1时从下往上
        int index=0;//表示当前的行数
        for(int i=0;i<s.size();i++)
        {
            rows[index].push_back(s[i]); //依次添加 0行 1行 2行....numROQs行的元素
            index+=flag;
            if(index==numRows-1 ||index==0)  //如果到了最后一行那就要转向 从下往上     又回到第一行后再次转向 由上往下   如此往复循环
            {
                flag=-flag;
            }
        }
        string res;  //存放结果的字符串
        for(auto c:rows)   //依次遍历
        {
            res+=c;
        }
        return res;
    }
};