阿里笔试2020-3-27

第一题【AC】

要求:将字符串s1转换为s2,
转换规则:每次可以将s1中的任意一个字符移动到s1的末尾
目的:求最少的改变次数时,s1转换为s2
比如

输入:
acdk
ckad
输出:
2

思路:
1、先判断s1,s2长度是否相等,不相等直接输出-1;
2、再判断s1,s2拥有的字符是否一致,不一致直接输出-1:
3、步骤3有点不好形容,见下图吧,只要遍历一下s1,查找在s2中有哪些匹配就好了,
步骤3思路

代码

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        fun(s1, s2);
    }

    public static void fun(String s1, String s2) {
        if (s1.length() != s2.length()) {
            System.out.println(-1);
            return;
        }
        char[] chars1 = s1.toCharArray();
        char[] chars2 = s2.toCharArray();
        Arrays.sort(chars1);
        Arrays.sort(chars2);
        for (int i = 0; i < chars1.length; i++) {
            if (chars1[i] != chars2[i]) {
                System.out.println(-1);
                return;
            }
        }
        int index2 = 0;
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) == s2.charAt(index2)) {
                index2++;
            }
        }
        int res = s2.length() - index2;
        System.out.println(res);
    }

第二题

没有出来,
直接输出1,过了5%,哈哈。

还得好好复习啊,大家加油!!!!

#阿里笔试##笔试题目#
全部评论
没有参加这场考试,来个第一题python版的。补充一下楼主:实际上这道题是贪心,因为 s1 每次挑的字符都要放到末尾,因此, s2 的前缀应该尽可能和 s1 中的子序列相匹配。因此,s1 每次都往后移动,s2 只有当前字符和 s1 相同时才移动。最后,s2 移动到的位置就是尽可能匹配的所有字符了。  最后卑微求问第二题的题目,可以试着做一下。
4 回复 分享
发布于 2020-03-27 12:53
第一题很快就写完了,一开始没有考虑s1,s2拥有的字符是否一致,直接写了,发现100%过了,就没管了。 第二题写了40分钟,过了10%,害。
3 回复 分享
发布于 2020-03-27 14:23
感谢大佬~~~求 第二题题目~~~
点赞 回复 分享
发布于 2020-03-27 12:05
请问一面以后状态一直是面试中,是不是挂了?还有希望吗
点赞 回复 分享
发布于 2020-03-27 18:21
我记得题目明明说了输入两个长度的相同的字符串,所以我的代码里没有判断字符数量不相等的情况,然后我也模仿了这个规则进行计数,结果我的测试案例通过率是0,是因为我没有判断长度是否相同导致的吗?
点赞 回复 分享
发布于 2020-03-27 19:03
没有参加这次的笔试,因为不敢。 按照上面的题目理解,我也尝试给出一个Solution。 基本思路: 1. s1元素的最后元素在s2中找到对应位置; 2. 在s2对应位置后面的元素; 3. 在s1的这个元素被选中,转移到s1的末尾; 4. 直到s1和s2完全相同,则输出移动的步数。 另外,我觉得很多时候要提前想Testcase;如果在线编程测试时,哪些没有通过的例子能显示出来就好了——就想LeetCode的环境,我觉得难度会降不少。 show the code ``` def moves(sa, sb):     steps = 0     if len(sa)!=len(sb)&nbs***bsp;set(sa)!=set(sb):         return 0 # impossible     else:         sa = list(sa)         sb = list(sb)         while sa!=sb:             try:                 moveC = sb[sb.index(sa[-1])+1]             except IndexError:                 moveC = sa[0]                          sa.remove(moveC)             sa.append(moveC)             steps += 1     return steps if __name__ == "__main__":     s1 = 'aac'     s2 = 'caa'     print(moves(s1, s2)) ```
点赞 回复 分享
发布于 2020-03-28 13:51
# s1→s2 每次只能移动一个字母到最后,求移动的最少次数 if __name__ == "__main__":     s1=str(input('1'))     s2=str(input('2'))     if len(s1)!=len(s2):         print(-1)     elif sorted(s1)!=sorted(s2):         print(-1)     else:         i=0         flag=False         for j in range(len(s2)):              if flag==True:                 print(len(s1)-j+1)                 break                 while True:                 if i==len(s1):                     flag=True                     break                 if s1[i]==s2[j]:                     i+=1                     break                   else:                     i+=1
点赞 回复 分享
发布于 2020-03-28 14:34
有大佬能用c++写一下吗,万分感谢
点赞 回复 分享
发布于 2020-03-28 21:35

相关推荐

评论
2
12
分享
牛客网
牛客企业服务