几道简单的算法题(来自leetcode)

大家好,我是烤鸭,不得不承认,这是水了一篇博客,贴几道最近刷的简单的算法题。

   1.    Lexico graphical Numbers

         给定一个整数n,按字典顺序返回1 - n。

         例如,给出13,返回:[1,10,11,12,13,2,3,4,5,6,7,8,9]。

         请优化您的算法以节省时间和空间。输入大小可能高达5,000,000。

public static List<Integer> lexicalOrder(int n) {
        List<Integer> ans = new ArrayList<>(n);
        for (int i = 1, curr = 1; i <= n; ++i) {
            ans.add(curr);
            if (curr * 10 <= n) {
                curr *= 10;
            } else {
                while (curr % 10 == 9 || curr == n) curr /= 10;
                curr++;
            }

        }
        return ans;
    }

    public static void main(String[] args) {
        System.out.println(lexicalOrder(13));
    }

2.    Longest Absolute File Path

假设我们按照以下方式通过字符串来抽象我们的文件系统:
 该字符串"dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"表示:
             dir
             subdir1
             subdir2

             file.ext

     该目录dir包含一个空的子目录subdir1和一个subdir2包含文件的子目录file.ext。
  该字符串"dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext"表示:
             dir
             subdir1
             file1.ext
             subsubdir1
             subdir2
             subsubdir2

             file2.ext

该目录dir包含两个子目录subdir1和subdir2。subdir1包含一个文件file1.ext和一个空的二级子目录subsubdir1。subdir2包含一个subsubdir2包含文件的二级子目录file2.ext。
         我们感兴趣的是找到文件系统中文件的最长(字符数)绝对路径。例如,在上面的第二个例子中,最长的绝对路径是"dir/subdir2/subsubdir2/file2.ext",其长度是32(不包括双引号)。
         给定一个以上述格式表示文件系统的字符串,将最长的绝对路径的长度返回到抽象文件系统中的文件。如果系统中没有文件,则返回0。
            注意:
         文件的名称至少包含一个.和一个扩展名。
         目录或子目录的名称将不包含.。
         所需时间复杂度:O(n)这里n是输入字符串的大小。

         a/aa/aaa/file1.txt如果还有其他路径,请注意这不是最长的文件路径aaaaaaaaaaaaaaaaaaaaa/sth.png。

 public static int lengthLongestPath(String input) {
        Deque<Integer> stack = new ArrayDeque<>();
        stack.push(0); // "dummy" length
        int maxLen = 0;
        for(String s:input.split("\n")){
            int lev = s.lastIndexOf("\t")+1; // number of "\t"
            int pop = 0;
            while(lev+1<stack.size()) pop += stack.pop(); // find parent
            int len = stack.peek()+s.length()-lev+1; // remove "/t", add"/"
            if(pop < len)
                stack.push(len);
            else
                stack.push(pop);
            // check if it is file
            if(s.contains(".")) maxLen = Math.max(maxLen, len-1);
        }
        return maxLen;
    }
    public static void main(String[] args) {
        System.out.println(lengthLongestPath("dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"));
//        System.out.println(lengthLongestPath("dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext"));
    }

以上是对着discuss的高票答案改了改。

3.    Robot sequence of its moves

最初,位置(0,0)处有一个机器人。给出它的一系列动作,判断这个机器人是否有一个圆圈,这意味着它移回到原来的位置。

     移动顺序由一个字符串表示。而每一个动作都是由一个人物来表现的。有效的机器人移动是R(右),L(左),U(上)和D(下)。输出应该是真或假,表示机器人是否做出圆圈。

     例1:
     输入: “UD”
     输出: true
     例2:
     输入: “LL”

     输出:false

这题太简单了。。。。高票答案是用的switch,我用的if else。

 public static boolean judgeCircle(String moves) {
        Boolean flag = false;
        int up =0,down =0,left =0,right =0;
        for (char move:moves.toCharArray()) {
            if(move == 'U') up++;
            if(move == 'D') down++;
            if(move == 'L') left++;
            if(move == 'R') right++;
        }
        if(left == right && up == down) flag = true;
        return flag;
    }

    public static void main(String[] args) {
        System.out.println(judgeCircle("LL"));
    }

4.    Find All Anagram sina String

    给定一个字符串小号和非空字符串p,找到的所有开始指数p中的字谜小号。
      字符串只包含小写英文字母,字符串s和p的长度不会超过20,100。
      输出的顺序并不重要。
      例1:
              输入: s:“cbaebabacd”p:“abc” 输出:
[ 0,6 ] 

说明:

              起始索引= 0的子字符串是“cba”,它是“abc”的一个字母组合。
              起始索引= 6的子字符串是“bac”,它是“abc”的一个字母组合
      例2:

              输入: s:“abab”p:“ab” 输出: [0,1,2] 

说明:

              起始索引= 0的子字符串是ab,它是ab的一个字母组合
              开始索引= 1的子字符串是“ba”,它是“ab”的一个字母组合。

              起始索引= 2的子字符串是“ab”,它是“ab”的一个字母组合。

自己写的答案,效率没有高票的快。

public static List<Integer> findAnagrams(String s, String p) {
        //cbaebabacd
        ArrayList<Integer> list = new ArrayList<>();
        char[] array = s.toCharArray();
        for (int sir = 0; sir < array.length - p.length() + 1; sir++) {
            String sirs = s.substring(sir, sir + p.length());
            char[] arraySirs = sirs.toCharArray();
            char[] arrayP = p.toCharArray();
            int sirRes = 0, pRes = 0;
            for (int l = 0; l < (arraySirs.length>arrayP.length?arraySirs.length:arrayP.length); l++) {
                sirRes += arraySirs[l] - 'a';
                pRes += arrayP[l] - 'a';
            }
            if (sirRes == pRes) list.add(sir);
        }
        return list;
    }

    public static void main(String[] args) {
        long first = System.nanoTime();
        System.out.println(first);
        String s = "cbaebabacd";
        String p = "abc";
        System.out.println(findAnagrams(s, p));
        System.out.println(System.nanoTime() - first);
    }

猜你喜欢

转载自blog.csdn.net/angry_mills/article/details/79671376