• 经典测试工程师面试题(三)


    经典测试工程师面试题(三)

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

    说明:
    返回的下标值(index1 和 index2)不是从零开始的。
    你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
    示例:
    输入: numbers = [2, 7, 11, 15], target = 9
    输出: [1,2]
    解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
    
     1 ## python
     2 class Solution(object):
     3     def twoSum(self, numbers, target):
     4         l=0
     5         r=len(numbers)-1
     6         while(l<r):
     7             if(numbers[l]+numbers[r]== target):
     8                 return [l+1,r+1]
     9             if(numbers[l]+numbers[r] <target):
    10                 l += 1
    11             else:
    12                 r -= 1
    ## 测试用例:
    def test_towSum1(self):
        assert towSum([0,1, 1, 2, 3, 6,8], 2) == [1, 4]
    
    def test_towSum2(self):
        assert towSum([1,2,5,6,12], 13) == [1, 5]
    
    def test_towSum3(self):
        assert towSum([2, 7, 11, 15], 9) == [1, 2]
    ## Java
    public int[] twoSum(int[] numbers, int target) {
            int left = 0;
            int right = numbers.length - 1;
            while (left < right) {
                if (numbers[left] + numbers[right] == target) {
                    return new int[]{left + 1, right + 1};
                }
                if (numbers[left] + numbers[right] < target) {
                    left += 1;
                } else {
                    right -= 1;
                }
            }
            return null;
        }

    假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。

     1 示例 1 2 
     3 输入: 2
     4 输出: 2
     5 解释: 有两种方法可以爬到楼顶。
     6 1.  1 阶 + 1 7 2.  2 8 示例 2 9 
    10 输入: 3
    11 输出: 3
    12 解释: 有三种方法可以爬到楼顶。
    13 1.  1 阶 + 1 阶 + 114 2.  1 阶 + 215 3.  2 阶 + 1 阶
    Python
    ## 不推荐 效率极低 ##
    def setpMethod(num):
       if(n == 1 or n == 2):
                return n
        else:
            return self.setpMethod(num-1)+self.setpMethod(num-2)
     1 ## 推荐写法 ##
     2     def climbStairs(self, n):
     3         if(n == 1 or n == 2):
     4             return n
     5         num1=1
     6         num2=2
     7         while(n >= 3):
     8             result = num1 + num2
     9             num1 = num2
    10             num2 = result
    11             n -=1
    12         return result
     1 ## Java ##
     2 public int setpMethod(int n){
     3         if(n ==1 || n ==2){
     4         return n;
     5         }
     6         int result = 0,n1 = 1,n2 = 2;
     7         while (n>=3){
     8             result = n1 + n2;
     9             n1 = n2;
    10             n2 = result;
    11             n--;
    12         }
    13         return result;
    14     }

    给定一个非负整数数组,你最初位于数组的第一个位置。

    数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。

    示例 1:
    
    输入: [2,3,1,1,4]
    输出: true
    解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
    示例 2:
    
    输入: [3,2,1,0,4]
    输出: false
    解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
     1 ## python ##
     2 class Solution(object):
     3     def canJump(self, nums):
     4         need = 1
     5         if(len(nums) ==1):
     6             return True
     7         if(nums[0] == 0):
     8             return False
     9         for i in range(len(nums)-2,-1,-1):
    10             if(nums[i] == 0 or nums[i] < need):
    11                 need += 1
    12             else:
    13                 need = 1
    14         if(need == 1) :
    15             return True
    16         else:
    17             return False
    ## java ##
    public boolean canJump(int[] nums) {
            int n = 1;
            if(nums.length ==1){
            return true;
            }
            if(nums[0] == 0){
            return false;
            }
            for(int i=nums.length-2; i>=0; i--){
                if(nums[i] >= n){
                    n=1;
                }else{
                    n++;
                }
            }
            if(n == 1){
                return true;
            }else{
                return false;
            }
        }

    以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

    在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

    请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

     1 示例 1 2 
     3 输入:"/home/"
     4 输出:"/home"
     5 解释:注意,最后一个目录名后面没有斜杠。
     6 示例 2 7 
     8 输入:"/../"
     9 输出:"/"
    10 解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
    11 示例 312 
    13 输入:"/home//foo/"
    14 输出:"/home/foo"
    15 解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
    16 示例 417 
    18 输入:"/a/./b/../../c/"
    19 输出:"/c"
    20 示例 521 
    22 输入:"/a/../../b/../c//.//"
    23 输出:"/c"
    24 示例 625 
    26 输入:"/a//b////c/d//././/.."
    27 输出:"/a/b/c"
    ##python##
    def simplifyPath(self, path):
            """
            :type path: str
            :rtype: str
            """
            paths = path.split('/')
            str = ''
            pathlist = [i for i in paths if I]
            result = []
            for j in range(len(pathlist)):
                print(j)
                if(pathlist[j] == ".."):
                    if(result):
                        result.pop()
                elif(pathlist[j] == "."):
                    continue
                else :
                    result.append(pathlist[j])
            if not result:
                return '/'
            for k in range(len(result)):
                str = str + '/' + result[k]
            return str

    给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '' 的通配符匹配。'?' 可以匹配任何单个字符。'' 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。

    说明:
    s 可能为空,且只包含从 a-z 的小写字母。
    p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
    示例 1:
    
    输入:
    s = "aa"
    p = "a"
    输出: false
    解释: "a" 无法匹配 "aa" 整个字符串。
    示例 2:
    
    输入:
    s = "aa"
    p = "*"
    输出: true
    解释: '*' 可以匹配任意字符串。
    示例 3:
    
    输入:
    s = "cb"
    p = "?a"
    输出: false
    解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
    示例 4:
    
    输入:
    s = "adceb"
    p = "*a*b"
    输出: true
    解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".
    示例 5:
    
    输入:
    s = "acdcb"
    p = "a*c?b"
    输入: false
     1 ##python##
     2 def isMatch(self, s, p):
     3         si, pi, pj, sj = 0, 0, -1, -1
     4         while si < len(s):
     5             if pi < len(p) and p[pi] == '*':
     6                 pi += 1
     7                 pj = pi
     8                 sj = si
     9             elif pi < len(p) and (p[pi] == '?' or p[pi] == s[si]):
    10                 pi += 1
    11                 si += 1
    12             elif pj != -1:
    13                 pi = pj
    14                 sj += 1
    15                 si = sj
    16             else:
    17                 return False
    18         while (pi < len(p) and p[pi] == '*'):
    19             pi += 1
    20         return pi == len(p)
     
    执行结果.png

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例:
    
    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807
     1 ## python ##
     2 class Solution(object):
     3     def addTwoNumbers(self, l1, l2):
     4         n =l1.val + l2.val
     5         l3 = ListNode(n%10)
     6         l3.next = ListNode(n//10)
     7         p1 = l1.next
     8         p2 = l2.next
     9         p3 = l3
    10         while True:
    11             if p1 and p2:
    12                 sum = p1.val+ p2.val + p3.next.val
    13                 p3.next.val = sum % 10
    14                 p3.next.next = ListNode(sum//10)
    15                 p1 = p1.next
    16                 p2 = p2.next
    17                 p3 = p3.next
    18             elif p1 and not p2:
    19                 sum = p1.val + p3.next.val
    20                 p3.next.val = sum %10
    21                 p3.next.next = ListNode(sum // 10)
    22                 p1 = p1.next
    23                 p3 = p3.next
    24             elif not p1 and p2:
    25                 sum = p2.val +p3.next.val
    26                 p3.next.val = sum % 10
    27                 p3.next.next = ListNode(sum // 10)
    28                 p2 = p2.next
    29                 p3 = p3.next
    30             else :
    31                 if p3.next.val == 0:
    32                     p3.next = None
    33                 break
    34         return l3
     
    执行结果.png


    【转】龚十一
  • 相关阅读:
    输入adb shell 时 提示error: more than one device and emulator
    增加 addDataScheme("file") 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略
    Android音乐编程:管理音频焦点
    Android MediaScanner 详尽分析
    MediaScanner与音乐信息扫描==
    Vold工作流程分析学习
    [LeetCode] Majority Element II
    Android 四大组件学习之ContentProvider五
    HDU 1171 Big Event in HDU(01背包)
    Atom编辑器折腾记_(15)JS代码片段补全(插件:javascript-snippets)
  • 原文地址:https://www.cnblogs.com/vickyx/p/13813166.html
Copyright © 2020-2023  润新知