编程题训练2

最后一个单词的长度

  • 给定一个字符串, 包含大小写字母、空格’ ‘,请返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0
public class Solution {
    /**
     * @param s A string
     * @return the length of last word
     */
    public int lengthOfLastWord(String s) {
        // Write your code here

        String[] s1 = s.split(" ");
        return  s1[s1.length-1].length();
    }
}

给一个词典,找出其中所有最长的单词

样例

在词典
{
“dog”,
“google”,
“facebook”,
“internationalization”,
“blabla”
}
中, 最长的单词集合为 [“internationalization”]

在词典

{
“like”,
“love”,
“hate”,
“yes”
}
中,最长的单词集合为 [“like”, “love”, “hate”]

class Solution {

    /**
     * @param dictionary: an array of strings
     * @return: an arraylist of strings
     */
    ArrayList<String> longestWords(String[] dictionary) {
        // write your code here
        if(dictionary.length == 0){
            return null;
        }

        ArrayList<String> result = new ArrayList<String>();

        result.add(dictionary[0]);

        for(int i = 1;  i < dictionary.length; i++){
            String temp = dictionary[i];

            if(temp.length() > result.get(0).length()){
                result.clear();
                result.add(temp);
            }else if( temp.length() == result.get(0).length()){
                   result.add(temp);
            }
        }
        return result;
    }
};

---

有效回文串

给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。

注意事项
你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题。
在这个题目中,我们将空字符串判定为有效回文

样例

“A man, a plan, a canal: Panama” 是一个回文。”race a car” 不是一个回文。

   /**
     * @param s A string
     * @return Whether the string is a valid palindrome
     */
    public boolean isPalindrome(String s) {
        if (s == null || s.length() == 0) {
            return true;
        }
        s = s.toLowerCase();
        int left = 0;
        int right = s.length() - 1;
        while(left < right){
            while(left < s.length() && !isValid(s.charAt(left))){// nead to check range of a/b
                left++;
            }
            if(left == s.length()){// for emtpy string “.,,,”
                return true;
            }s
            while(right >= 0 && !isValid(s.charAt(right))){
                right--;
            }
            if(Character.toLowerCase(s.charAt(left)) == Character.toLowerCase(s.charAt(right))){
                right--;
                left++;
            }else{
                break;
            }
        }
        return right <= left;
    }

    /**
     * 是否为有效
     */
    private boolean isValid(char c){
        return Character.isLetter(c) || Character.isDigit(c);
    }

二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示)

样例

a = 11

b = 1

返回 100

public class Solution {
    /**
     * @param a a number
     * @param b a number
     * @return the result
     */
     //如果超过 long 长度则gg
    private static String addBinary(String a, String b) {
        long x = Long.valueOf(a, 2);
        long y = Long.valueOf(b, 2);
        long z = x + y;
        String binaryString = Long.toBinaryString(z);
        return binaryString;
    }

    public String addBinary(String a, String b) {
        // Write your code here
         if(a.length() < b.length()){
            String tmp = a;
            a = b;
            b = tmp;
        }

        int pa = a.length()-1;
        int pb = b.length()-1;
        int carries = 0;
        String rst = "";

        while(pb >= 0){
            int sum = (int)(a.charAt(pa) - '0') + (int)(b.charAt(pb) - '0') + carries;
            rst = String.valueOf(sum % 2) + rst;
            carries = sum / 2;
            pa --;
            pb --;
        }

        while(pa >= 0){
            int sum = (int)(a.charAt(pa) - '0') + carries;
            rst = String.valueOf(sum % 2) + rst;
            carries = sum / 2;
            pa --;
        }       

        if (carries == 1)
            rst = "1" + rst;
        return rst;
    }
}

查找字符串

  • 对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1。

说明

在面试中我是否需要实现KMP算法?

不需要,当这种问题出现在面试中时,面试官很可能只是想要测试一下你的基础应用能力。当然你需要先跟面试官确认清楚要怎么实现这个题。

样例

如果 source = “source” 和 target = “target”,返回 -1。

如果 source = “abcdabcdefg” 和 target = “bcd”,返回 1。

//暴力
if(source==null||target==null)
    {
        return -1;
    }

    int sl = source.length();
    int tl = target.length();

    int i = 0;
    int j = 0;

    while(i<sl&&j<tl)
    {
        if (source.charAt(i) == target.charAt(j)) {
            i++;
            j++;
        } else {
            i = i - j + 1;
            j = 0;

        }

    }

    if(j==tl)
    {
        return i - j;
    }else
    {
        return -1;
    }


 //KMP ..不会
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值