Alibaba CloudTianchiオンラインプログラミング1月30日No.56ウィークリーコンテスト

目次

1.数値を計算します

次に、最も分割されていない部分文字列

3、鏡面反射


1.数値を計算します

難易度:簡単 

タイトル説明

10進数のnumが与えられた場合、それを2進数に変換し、1の数値と位置を返す必要があります。

  • n <= 10 ^ 9

例1:

输入: 10
输出: [2,1,3]
解释: 10转成2进制为1010,总共有2个1,所以ouptput数组第一个是2。然后1的位置是第1个和第3个,所以后续两个数为1,3.

例2:

输入: 7
输出: [3,1,2,3]
解释: 7转成2进制为111,总共有3个1,所以output数组第一个是3。然后的位置是第1个、第2个和第3个,所以后续三个数为1,2,3.

 私の解決策:

public class Solution {
    /**
     * @param num: the num
     * @return: the array subject to the description
     */
    public int[] calculateNumber(int num) {
        int t, x, y = 0, i;
        String s = "";
        x = num;
        while (x != 0) {
            t = x % 2;
            x /= 2;
            if (t == 1)
                y++;
            s = t + s;
        }
//        System.out.println(s);
        int[] r = new int[y + 1];
        r[0] = y;
        int j=1;
        for (i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '1')
                r[j++] = i + 1;
        }
        return r;
    }
}

次に、最も分割されていない部分文字列

難易度:簡単

タイトル説明

n 小文字を含む文字列の場合、文字列を いくつかの連続した部分文字列に分割し、部分文字列の文字を同じにし、部分文字列の文字数がを超えないよう kにし、要件を満たす最小の部分文字列数を出力する必要があります。

翻訳:n個の小文字を含む文字列の場合、文字列はいくつかの連続する部分文字列に分割する必要があり、部分文字列の文字は同じである必要があり、部分文字列の文字数はkを超えず、出力は最小値を満たします。必要な部分文字列の数。

  • n≤1e5

例1

输入: s = "aabbbc", k = 2
输出: 4
解释:
划分成 "aa", "bb", "b", "c" 四个子串

例2

输入: s = "aabbbc", k = 3
输出: 3
解释: 
划分成 "aa", "bbb", "c" 三个子串

例を直接見ると、トピックがわかりやすくなります。

私の解決策:

public class Solution {
    /**
     * @param s: the string s
     * @param k: the maximum length of substring
     * @return: return the least number of substring
     */
    public int getAns(String s, int k) {
        int l = 0, c = 0, i, j;
        while (c < s.length() - 1) {
            j = c + 1;
            i = 1;
            while (i < k && j<s.length()-1&&s.charAt(c) == s.charAt(j)) {
                j++;
                i++;
            }
            l++;
            c += i;
        }
        if (s.charAt(s.length()-1)!=s.charAt(s.length()-2))
            l+=1;
        return l;
    }
}

3、鏡面反射

難易度:

タイトル説明

各壁に鏡のある特別な正方形の部屋があります。南西の角に加えて、すべての角に受信機、番号0、 1も 配置されました 2

正方形の部屋の壁の長さは、 p南西の角から発射されたレーザービームが最初に東の壁に当たり、入射点と受信機の 0 間の距離は q です。

ライトが最初に遭遇するレシーバーの番号を返します(ライトが最終的にレシーバーに遭遇することを保証します)。

  • 1 <= p <= 1000
  • 0 <= q <= p

https://lintcode-media.oss-us-west-1.aliyuncs.com/problem/reflection.png

例1:

输入: p = 2, q = 1
输出: 2
解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。

例2:

输入: p = 3, q = 1
输出: 1
解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 1 。

 解決策は、ルールを見つけ、鏡面反射光が画像を描くことによって受信機に到達するいくつかの状況を見つけることです。

p / q = 1、リーチ1; p / q = 2、リーチ2; p / q = 3、リーチ1; p / q = 4、リーチ2;……(ここでの除算は除算を意味します

p = 3およびq = 2の場合、p / q = 3/2。どちらに到達しますか?

ハンドアクションチャートは、それが0に到達したことを発見しました。

このことから、分割可能な結果は1になり、レシーバー1に送られ、除数は2になり、レシーバー2に送られ、他の分割されていない結果はレシーバー0に送られると考えることができます。

 ただし、これは3つの状況が十分に考慮されていることを意味するものではなく、各受信者の状況に対応しています。

たとえば、p = 5、q = 3、p / q = 5/3の場合、実際にはレシーバー1に到達しますが、これは上記の想定ルールに準拠していないため、ルールをさらに探してください。

ルールを見つける:

  1. pが奇数、qが奇数の場合、受信機1に到達します。
  2. pが奇数、qが偶数の場合、レシーバー0に到達します。
  3. pが偶数、qが奇数の場合、受信機2に到達します。

pとqの両方が偶数の場合、奇数と偶数に減らすことができます。これは、上記のいずれかの場合と同等です。

public class Solution {
    /**
     * @param p: an integer
     * @param q: an integer
     * @return: the number of the receptor that the ray meets first
     */
    public int mirrorReflection(int p, int q) {
        if(p%2==1&&q%2==1)
            return 1;
        else if(p%2==1&&q%2==0)
            return 0;
        else
            return 2;
    }
}

 Ali Tianchiでオンラインプログラミングの質問に答えるのはこれが初めてであり、Javaで質問に答えるのも初めてでした。この記事では主に3番目の質問である鏡面反射の思考と回答の結果について説明します。 2番目の質問は比較的単純です。答えはコードで簡単に確認できます。

良いと思う場合は、ブックマーク、フォロー、質問がある場合は直接コメント、交換して学ぶなど、「ワンクリック、3リンク」へようこそ。


私のCSDNブログ:https://blog.csdn.net/Charzous/article/details/113444688

おすすめ

転載: blog.csdn.net/Charzous/article/details/113444688