5_5g - CSDN
  • 【LeetCode】5. Longest Palindromic Substring 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/longest-palindromic-substring/description/ 题目描述: Given a string s, ...

    作者: 负雪明烛
    id: fuxuemingzhu
    个人博客: http://fuxuemingzhu.cn/


    题目地址:https://leetcode.com/problems/longest-palindromic-substring/description/

    题目描述

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

    Example:

    Input: "babad"
    
    Output: "bab"
    
    Note: "aba" is also a valid answer.
    

    Example:

    Input: "cbbd"
    
    Output: "bb"
    

    题目大意

    找出字符串中最长的回文子串。

    解题方法

    暴力遍历

    遍历算法是我们最直观的解法,事实上也能通过OJ。我们使用的方法是两重循环确定子串的起始和结束位置,这样只要判断该子串是个回文,我们保留最长的回文即可。

    代码很简单,C++版本如下:

    class Solution {
    public:
        string longestPalindrome(string s) {
            const int N = s.size();
            string res;
            for (int i = 0; i < N; i++) {
                for (int j = i; j < N; j++) {
                    if (j - i + 1 >= res.size() && isPalindrome(s, i, j)) {
                        res = s.substr(i, j - i + 1);
                    }
                }
            }
            return res;
        }
        // [start, end]
        bool isPalindrome(string& s, int start, int end) {
            const int N = s.size();
            int l = start, r = end;
            while (l <= r) {
                if (s[l++] != s[r--]) {
                    return false;
                }
            }
            return true;
        }
    };
    

    动态规划

    动态规划的两个特点:第一大问题拆解为小问题,第二重复利用之前的计算结果,来解答这道题。

    那如何划分小问题呢,我们可以先把所有长度最短为1的子字符串计算出来,根据起始位置从左向右,这些必定是回文。然后计算所有长度为2的子字符串,再根据起始位置从左向右。到长度为3的时候,我们就可以利用上次的计算结果:如果中心对称的短字符串不是回文,那长字符串也不是,如果短字符串是回文,那就要看长字符串两头是否一样。这样,一直到长度最大的子字符串,我们就把整个字符串集穷举完了。

    我们维护一个二维数组dp,其中dp[i][j]表示字符串区间[i, j]是否为回文串,当i = j时,只有一个字符,肯定是回文串,如果i = j + 1,说明是相邻字符,此时需要判断s[i]是否等于s[j],如果i和j不相邻,即i - j >= 2时,除了判断s[i]和s[j]相等之外,dp[j + 1][i - 1]若为真,就是回文串,通过以上分析,可以写出递推式如下:

    dp[i, j] = 1                                        if i == j
    
             = s[i] == s[j]                             if j = i + 1
    
             = s[i] == s[j] && dp[i + 1][j - 1]         if j > i + 1      
    

    代码刚提交的时候超时了,但是使用set一下,看看是否只包含相同字符,这样就通过了!

    class Solution(object):
        def longestPalindrome(self, s):
            """
            :type s: str
            :rtype: str
            """
            if len(set(s)) == 1: return s
            n = len(s)
            start, end, maxL = 0, 0, 0
            dp = [[0] * n for _ in range(n)]
            for i in range(n):
                for j in range(i):
                    dp[j][i] = (s[j] == s[i]) & ((i - j < 2) | dp[j + 1][i - 1])
                    if dp[j][i] and maxL < i - j + 1:
                        maxL = i - j + 1
                        start = j
                        end = i
                dp[i][i] = 1
            return s[start : end + 1]
    

    C++版本代码如下,需要注意的是这里的res初始化为第一个字符:

    class Solution {
    public:
        string longestPalindrome(string s) {
            const int N = s.size();
            if (N == 0) return "";
            string res = s.substr(0, 1);
            vector<vector<bool>> dp(N, vector(N, false));
            // s[j, i]
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < i; j++) {
                    dp[j][i] = (s[j] == s[i]) && (i == j + 1 || dp[j + 1][i - 1]);
                    if (dp[j][i] && i - j + 1 >= res.size()) {
                        res = s.substr(j, i - j + 1);
                    }
                }
                dp[i][i] = true;
            }
            return res;
        }
    };
    

    二刷—

    马拉车算法。。待续

    参考:
    http://www.cnblogs.com/grandyang/p/4464476.html
    https://segmentfault.com/a/1190000002991199

    日期

    2018 年 3 月 15 日 —— 雾霾消散,春光明媚
    2019 年 1 月 19 日 —— 有好几天没有更新文章了

    展开全文
  • 5. 最长回文子串

    2019-09-20 20:33:10
    5. 最长回文子串

    题目:https://leetcode-cn.com/problems/longest-palindromic-substring/

    算法并非原创,而是由力扣上的大神给出

    代码运行结果:

    执行用时 :2 ms, 在所有 Java 提交中击败了100.00%的用户

    内存消耗 :36.4 MB, 在所有 Java 提交中击败了90.88%的用户

    我们定义一个函数L(x),其中L(n)表示字符串s中以s.charAt(n)为中心的最长回文的长度

    比如s = "abcbab"时,L(0) = 1,L(1) = 1,L(2) = 5,L(3) = 1,L(4) = 3,L(5) = 1

    L(2)求法(L(0)等也是类似的):

    先初始化为1,然后比较s.charAt(1)和s.charAt(3)是否相等

      -- 是的话+2并继续比较s.charAt(0)和s.charAt(4)

      -- 否的话,当前L(2)的值就是最终L(2)的值

    那么求s的最长回文子串时,只需要找到使得L(x)最大的x值即可(结论1)

    再来看2个回文:"abcba"和"abba",前者的中心是字符'c',而后者的中心是两个字符'b'之间的空格

    因为这个特性,一般寻找回文时都会在原字符串的各个字符后面加上一个空格,如"abcb" → "a b c b"

     

    假设在字符串s中有一个子串r,它由若干个相同字符组成,就假设是4个字符‘a’吧

    那么r可以表示为" a a a a "(注意空格是为了方便理解而加上去的)

    s可以表示为str1 + " a a a a " + str2,其中str1最后一个字符、str2第一个字符都不为‘a’

    分别给r中各个字符编号为0-8,如下所示

    L(0)到L(8)分别为0-1-2-3-L(4)-3-2-1-0,L(4)不小于4(在str1最后一个字符等于str2第一个字符时大于4)

    结合结论1(见上)得到,在由相同字符组成的子串中,我们只需要计算该子串最中间的字符对应的L(x)(结论2)

     

    再假设有一个字符串r,它由若干个相同的字符组成,就假设是由若干个字符'a'组成的吧,且其中间位置为c

    显然,如果str1 + 'a' + str2是回文,那么str1 + r + str2也是回文,且其中心位置也是c,从而推导出:

    在相同字符组成的子串中,在求以该子串中心为中心的最长回文时,可以把整个子串当作一个字符来处理(结论3)

     

    结论2使得“化多为中”,结论3使得“化中为一”,从而得出结论:

    求回文时,多个连续重复字符可以当作一个来处理

    另外,这个结论更厉害的地方在于,它使得我们在求回文时无需在原字符串的各个字符后面加上一个空格

    为什么原字符串需要加空格?

      -- 因为回文的中心有可能在2个字符之间

    为什么回文的中心有可能在2个字符之间?

      -- 因为原字符串中连续出现了偶数个相同字符组成的子串(如"abba","bbbb")

    现在,我不管你连续出现几个相同的字符,我统一按出现一个来处理,因此就不需要加空格了

     

    经过上面一大段分析,以下代码就不难理解了(代码和注释都是原作者给的):

    class Solution {
        public String longestPalindrome(String s) {
            if (s == null || s.length() == 0)
                return "";
            
            //保存起始位置,测试了用数组似乎能比全局变量稍快一点
            int[] range = new int[2];
            char[] str = s.toCharArray();
            
            for (int i = 0; i < s.length(); i++) {
                //把回文看成中间的部分全是同一字符,左右部分相对称
                //找到下一个与当前字符不同的字符
                i = findLongest(str, i, range);
            }
            return s.substring(range[0], range[1] + 1);
        }
        
        public static int findLongest(char[] str, int low, int[] range) {
            //查找中间部分
            int high = low;
            
            while (high < str.length - 1 && str[high + 1] == str[low])
                high++;
            
            //定位中间部分的最后一个字符
            int ans = high;
            
            //从中间向左右扩散
            while (low > 0 && high < str.length - 1 && str[low - 1] == str[high + 1]) {
                low--;
                high++;
            }
            
            //记录最大长度
            if (high - low > range[1] - range[0]) {
                range[0] = low;
                range[1] = high;
            }
            return ans;
        }
    }

     

    展开全文
  • 5天Fragment高级进阶

    千次阅读 2019-09-04 15:11:05
    Fragment高级进阶Fragment 传值介绍activity 给 fragment传值fragment 给 activity传值Activity中的代码Activity中的xml文件fragment中的代码fragment的xml文件fragment 给 fragment 传值handler传值接口回调传值...

    Fragment 回退栈

    代码演示:

    注意fragment的生命周期.

     radioGroupId.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    switch (checkedId) {
                        case R.id.person_id:
                            manager = getSupportFragmentManager();
                            fragmentTransaction = manager.beginTransaction();
    //                        fragmentTransaction.replace(R.id.frame_layout_id,new FristFragment());
                            fragmentTransaction.add(R.id.frame_layout_id,new FristFragment());
    						//入栈
                            fragmentTransaction.addToBackStack("11");
                            fragmentTransaction.commit();
                            break;
                        case R.id.message_id:
                            manager = getSupportFragmentManager();
    						
    						//出栈
                            manager.popBackStack(); 
                            SelectActivity.this.fragmentTransaction = manager.beginTransaction();
                            SelectActivity.this.fragmentTransaction.replace(R.id.frame_layout_id,new SecondFragment());
    //                        fragmentTransaction.addToBackStack(null);
                            SelectActivity.this.fragmentTransaction.commit();
                            break;
    
                        default:
                            break;
                    }
                }
            });
    
     	case R.id.message_id:
        manager = getSupportFragmentManager();
    //  manager.popBackStack();
        fragmentTransaction = manager.beginTransaction();
        fragmentTransaction.replace(R.id.frame_layout_id,new SecondFragment());
        //添加了返回栈,点击back的时候,不会退出activity,而会返回到之前的fragment界面.
    //  fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
         break;
    

    Fragment 传值介绍

    不同页面间传值是最基本的要求.(这是页面间的联动,交互)

    请看需求
    在这里插入图片描述

    activity 给 fragment传值

    主要涉及到一个方法是getArguments()和setArguments().
    一个设置属性值,一个去取属性值.

    步骤:
    要传的值,放到bundle对象里;
    在Activity中创建该Fragment的对象fragment,通过调用
    fragment.setArguments()传递到fragment中;
    然后更新fragment.
    在该Fragment中通过调用getArguments()得到bundle对象,就能得到里面的值。

    代码来了 这是刚创建完成的activity

    package com.example.day004;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    /**
     * activity 向 fragment 传值
     */
    public class A2FActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_a_2_f);
        }
    
    	//点击事件的方法
    	public void click(View view) {
    	}
    }
    

    这是修完以后的他的xml的布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".A2FActivity">
    
        <EditText
            android:id="@+id/et_id"
            android:hint="来啊,传点啥吧!"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
       <!--在activity中定义了点击事件-->
        <Button
            android:id="@+id/button_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="点我试试"
            android:onClick="click"
            />
    
        <!--用来显示内容的,是个容器,里面可以放fragment-->
        <LinearLayout
            android:orientation="horizontal"
            android:id="@+id/linear_layout_id"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </LinearLayout>
    
    </LinearLayout>
    

    创建fragment(右键一键完事,带布局)

    package com.example.day004.fragment;
    
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import com.example.day004.R;
    
    /**
      *用来接受传值的
     */
    public class ShowContextFragment extends Fragment {
        
        public ShowContextFragment() {
            // Required empty public constructor
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_show_context, container, false);
        }
    }
    
    

    修改后的fragment的xml布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".fragment.ShowContextFragment">
        
        <!--只加了一个Id,其他可有可无-->
        <TextView
            android:id="@+id/context_tv_id"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textColor="@color/colorAccent"
            android:textSize="30sp"
            android:text="@string/hello_blank_fragment" />
    
    </FrameLayout>
    

    完整版的fragment

    package com.example.day004.fragment;
    
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    import com.example.day004.R;
    
    /**
     *用来接受传值的
     */
    public class ShowContextFragment extends Fragment {
    
        private TextView textView;
        public ShowContextFragment() {
            // Required empty public constructor
        }
        //现在text里面的值是"hello_blank_fragment",思路就是拿到控件,重新赋值即可.
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View inflate = inflater.inflate(R.layout.fragment_show_context, container, false);
            //1 拿控件
            textView = inflate.findViewById(R.id.context_tv_id);
            //2 给控件赋值
            Bundle arguments = getArguments();
            if(arguments != null){ //第一次启动一定为null,所以要判断一下
                String key = arguments.getString("key");
                textView.setText(key);
            }
            return inflate;
        }
    
    }
    
    

    完整版的a2fActivity

    package com.example.day004;
    
    import android.icu.util.BuddhistCalendar;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    
    import com.example.day004.fragment.ShowContextFragment;
    
    import java.io.BufferedReader;
    
    /**
     * activity 向 fragment 传值
     */
    public class A2FActivity extends AppCompatActivity {
        private FragmentManager fragmentManager;
        private FragmentTransaction fragmentTransaction;
        private EditText editText;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_a_2_f);
    
            //0,取到edit的控件和值
            editText =  findViewById(R.id.et_id);
    
            //1,在这里动态添加一个fragment
            fragmentManager = getSupportFragmentManager();
            fragmentTransaction = fragmentManager.beginTransaction();
            //注意这个布局文件,是R.layout.activity_a_2_f xml文件里的线性布局
            fragmentTransaction.add(R.id.linear_layout_id,new ShowContextFragment());
            fragmentTransaction.commit();
        }
    
        public void click(View view) {
            //取到输入的值
            String string = editText.getText().toString();
            //创建fragment对象
            ShowContextFragment showContextFragment = new ShowContextFragment();
            //创建bundle
            Bundle bundle = new Bundle();
            bundle.putString("key",string);
            //给fragment对象赋值
            showContextFragment.setArguments(bundle);
    
            //动态修改fragment
            fragmentManager = getSupportFragmentManager();
            fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.linear_layout_id,showContextFragment);
            fragmentTransaction.commit();
        }
    }
    
    

    fragment 给 activity传值

    第一种:
    在Activity中调用getFragmentManager()得到fragmentManager,,调用findFragmentByTag(tag)或者通过findFragmentById(id)
    FragmentManager fragmentManager = getFragmentManager();
    Fragment fragment = fragmentManager.findFragmentByTag(tag);

    第二种:
    通过回调的方式,定义一个接口(可以在Fragment类中定义),接口中有一个空的方法,在fragment中需要的时候调用接口的方法,值可以作为参数放在这个方法中,然后让Activity实现这个接口,必然会重写这个方法,这样值就传到了Activity中.
    大白话,就是java的父类引用指向了子类对象

    按钮在fragment中.赖的重新画图了.谢谢.
    在这里插入图片描述

    Activity中的代码
    package com.example.day004;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    import com.example.day004.fragment.ShowTitleFragment;
    
    public class F2AActivity extends AppCompatActivity implements ShowTitleFragment.MyListener {
    
        private TextView textView;
        @Override
        public void sendMessage(String string) {
            textView.setText(string);
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_f_2_a);
            textView = findViewById(R.id.f2a_tv_id);
        }
    }
    
    Activity中的xml文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        tools:context=".F2AActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/f2a_tv_id"
            android:textSize="30sp"
            android:hint="提示而已"
            />
    
        <fragment
            android:name="com.example.day004.fragment.ShowTitleFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/f2a_fm_id">
    
        </fragment>
    
    </LinearLayout>
    
    fragment中的代码
    package com.example.day004.fragment;
    
    
    import android.content.Context;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.EditText;
    
    import com.example.day004.R;
    
    /**
     * A simple {@link Fragment} subclass.
     */
    public class ShowTitleFragment extends Fragment {
    
        private EditText editText;
        private Button button;
    
        private MyListener listener;
    
        public ShowTitleFragment() {
            // Required empty public constructor
        }
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            //拿到与当前fragment关联的Activity.
            listener = (MyListener) getActivity(); 
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View inflate = inflater.inflate(R.layout.fragment_show_title, container, false);
    
           //取到所有控件
            editText = inflate.findViewById(R.id.fm_title_et_id);
            button = inflate.findViewById(R.id.fm_title_button_id);
            //点击事件
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String string = editText.getText().toString();
                    if(string != null){
                        //注意了.这里是父类引用指向了子类对象,其实是activity中的sendmessage方法在执行.
                        listener.sendMessage(string);
                    }
                }
            });
    		//返回fragment中的布局视图
            return inflate;
        }
    
       //自定义的接口
        public interface MyListener{
            void sendMessage(String string);
        }
    
    }
    
    
    fragment的xml文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".fragment.ShowTitleFragment">
        
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/fm_title_et_id"
            android:hint="整的啥吧"
            />
    
        <Button
            android:id="@+id/fm_title_button_id"
            android:text="发送了啊"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    fragment 给 fragment 传值

    第一种:
    动态创建的fragment通过findFragmentByTag得到另一个的Fragment的对象,这样就可以调用另一个的方法了。
    静态创建的fragment通过findFragmentById得到另一个的Fragment的对象,这样就可以调用另一个的方法了。

    package com.example.day005.fragment;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import com.example.day005.R;
    
    /**
     * A simple {@link Fragment} subclass.
     */
    public class LeftFragment extends Fragment {
    
        private EditText editText;
        private Button send_button;
    
        public LeftFragment() {
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View inflate = inflater.inflate(R.layout.fragment_left, container, false);
            editText = inflate.findViewById(R.id.left_textView_id);
            send_button = inflate.findViewById(R.id.left_button_id);
    
            send_button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String string = editText.getText().toString();
                    
                    **了解一种即可,不重点**
                    //1 fragment传值方式1
                    // 通过id找的指定fragment,调用他的方法,给他的组件赋值.
                    FragmentManager fragmentManager = getFragmentManager(); //注意,这个manager是v4包下的.
                    RightFragment rightFragment=(RightFragment) fragmentManager.findFragmentById(R.id.right_fragment_id);
                    rightFragment.setTextView(string);
    
                    //2 通过id找的指定fragment,得到他所有的view.在通过findViewById 找到组件.赋值
                    TextView textView = getFragmentManager().findFragmentById(R.id.right_fragment_id).getView().findViewById(R.id.right_textview_id);
                    textView.setText(string);
    
                    //3
                    //因为两个fragment在一个activity里面,所有可以通过拿到activity里面所有的指定组件.
                    TextView textView = (TextView) getActivity().findViewById(R.id.right_textview_id);
                    textView.setText(string);
    
                }
            });
            return inflate;
        }
    }
    
    

    第二种(重点)

    通过接口回调的方式。
    与上面的接口回调用法相同

    第三种:
    通过setArguments,getArguments的方式。

    fragment 多层嵌套

    与正常使用区别不大

     FragmentManager childFragmentManager = getChildFragmentManager();
     FragmentTransaction fragmentTransaction = childFragmentManager.beginTransaction();
     fragmentTransaction.add(R.id.left_fragment_id,new RightFragment());
     fragmentTransaction.commit();
    

    案例(微信底部按钮与fragment实现界面切换)

    activity中的代码

    package com.example.day004.activities;
    
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.FrameLayout;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;
    import android.widget.Toast;
    
    import com.example.day004.R;
    import com.example.day004.fragment.FristFragment;
    import com.example.day004.fragment.SecondFragment;
    
    /**
     * 底部导航
     */
    public class SelectActivity extends AppCompatActivity {
        private FrameLayout frameLayoutId;
        private RadioGroup radioGroupId;
        private RadioButton personId;
        private RadioButton messageId;
        private static final String TAG = "SelectActivity";
        private FragmentManager manager;
        private FragmentTransaction fragmentTransaction;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_select);
    
            frameLayoutId = findViewById(R.id.frame_layout_id);
            radioGroupId = findViewById(R.id.radio_group_id);
    
            radioGroupId.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    switch (checkedId) {
                        case R.id.person_id:
                            manager = getSupportFragmentManager();
                            fragmentTransaction = manager.beginTransaction();
    //                        fragmentTransaction.replace(R.id.frame_layout_id,new FristFragment());
                            fragmentTransaction.add(R.id.frame_layout_id,new FristFragment());
                            fragmentTransaction.addToBackStack("11");
                            Log.i(TAG, "onCheckedChanged: "+SelectActivity.class.getName());
                            fragmentTransaction.commit();
                            break;
                        case R.id.message_id:
                            manager = getSupportFragmentManager();
                            manager.popBackStack();
                            SelectActivity.this.fragmentTransaction = manager.beginTransaction();
                            SelectActivity.this.fragmentTransaction.replace(R.id.frame_layout_id,new SecondFragment());
    //                        fragmentTransaction.addToBackStack(null);
                            SelectActivity.this.fragmentTransaction.commit();
                            break;
                        default:
                            break;
                    }
                }
            });
        }
    }
    
    

    activity的xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".activities.SelectActivity">
    
        <FrameLayout
            android:id="@+id/frame_layout_id"
            android:layout_weight="9"
            android:layout_width="match_parent"
            android:layout_height="0dp">
        </FrameLayout>
    
        <RadioGroup
            android:id="@+id/radio_group_id"
            android:layout_weight="1"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="0dp">
    
            <RadioButton
                android:layout_weight="1"
                android:id="@+id/person_id"
                android:button="@null"
                android:text="联系人"
                android:gravity="center"
                android:checked="true"
                android:drawableTop="@drawable/select_pserson"
                android:textColor="@drawable/select_text"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                />
    
            <RadioButton
                android:layout_weight="1"
                android:id="@+id/message_id"
                android:button="@null"
                android:gravity="center"
                android:drawableTop="@drawable/select_message"
                android:textColor="@drawable/select_text"
                android:text="信息"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                />
        </RadioGroup>
    
    </LinearLayout>
    

    说明
    android:drawableTop="@drawable/select_message"
    android:textColor="@drawable/select_text"
    这两个属性,参照下面链接创建
    https://blog.csdn.net/qq_34178710/article/details/91411003
    java代码中的fragment,右键创建即可.

    课后作业

    技能一:

    题目一:
    用静态和动态方式分别写一个Fragment与Activity绑定的案例,并演示Fragment的生命周期
    评分标准:
    1,静态绑定(10分)
    2,动态绑定(10分)
    3,注释和运行效果(10分)

    技能二:

    题目二:
    上下分别是两个Fragment,上面的Fragment中是一个listview,当点击item时,下面的Fragment显示对应的文字详细信息

    评分标准:
    1,创建Fragment(20分)
    2,创建ListView(10分)
    3,当点击item时,下面的Fragment显示对应的文字详细信息(20分)
    4,运行效果和注释(20分)

    技能三:

    Activity中实现4个Fragment的动态切换效果,底部四个按钮。点击第一个按钮显示Fragment1,点击第二个按钮显示Fragment2,以此类推。。。。。

    (1)第一个Fragment界面有一个ListView,这个ListView 使用第一个Fragment数据库中存储的数据.
    评分标准:
    2.2.1 ListView 优化(5分)
    2.2.2 ListView 中的数据按照字典顺序升序排列(5分)
    2.2.3 长按ListView 弹出一个菜单(5分)
    2.2.4 点击菜单中的删除则删除当前的item条目(5分)
    2.2.5 删除item的时候将对应的数据库中的数据一起删除(5分)

    (2)第二个Fragment界面 自定义上下文菜单 点击菜单发送一条通知
    评分标准:
    2.3.1 自定义上下文菜单(5分)
    2.3.2 点击上下文菜单项发送一条通知(5分)
    2,3,3,点击通知可以跳转到一个activity.
    2,3,4,通知要自定义布局,要一个按钮和一个文本.显示文字定义.

    (3)第三个Fragment界面 有一个按钮,按钮文本显示是"小三"…点击按钮,从底部缓缓弹出一个popupwindow…
    3.3.1 popupwindow有两个选项(选项内容自定义)(5分)
    3.3.2 popupwindow点击外部可消失(5分)
    3.3.3,popupwindow弹出时有遮罩效果. 取消时恢复.

    (4) 第四个Fragment界面.有一个按钮,点击按钮,把第三个Fragment界面的按钮的文字"小三"更改"好好学习";

    展开全文
  • Java 习题5 参考答案及解析(1)

    万次阅读 多人点赞 2020-01-08 10:13:09
    1.问答题 (1)子类可以有多个父类吗?...(5)子类重写方法的规则是怎样的?重写方法的目的是什么? (6)父类的final方法可以被子类重写吗? (7)什么类中可以有abstract方法? (8)对象的上转型对象有

    1.问答题

    (1)子类可以有多个父类吗?
    (2)java.lang包中的Object类是所有其他类的祖先吗?
    (3)如果子类和父类不在同一个包中,子类是否继承父类的友好成员?
    (4)子类怎样隐藏继承的成员变量?
    (5)子类重写方法的规则是怎样的?重写方法的目的是什么?
    (6)父类的final方法可以被子类重写吗?
    (7)什么类中可以有abstract方法?
    (8)对象的上转型对象有怎样的特点?
    (9)一个类的各个子类是怎样体现多态的?
    (10)面向抽象编程的目的和核心是什么?


    问答题解析

    1.不可以。Java是单继承的,只能继承一个父类。
    2.是。
    3.不继承。关于各个访问修饰符的访问权限可以看下表

    访问修饰符 本类 同包 子类 其他
    private T
    友好 T T
    protected T T T
    public T T T T

    4.声明与父类同名的成员变量。
    5.子类重写的方法的返回值类型,方法名,参数类型,顺序,个数都要与父类继承的方法相同,而且访问修饰符的限定范围大于等于父类方法。目的是可以父类的状态和行为改变为自身的状态和行为,实现多态。
    6.不可以
    7.abstract类。abstract方法必须在abstract类中,而abstract类中可以没有abstract方法
    8.上转型对象不能操作子类新增的成员变量,不能调用子类新增的方法。上转型对象可以访问子类继承或隐藏的成员变量,可以调用子类继承的方法或子类重写的实例方法。
    9.通过重写方法。
    10.面向抽象编程目的是为了应对用户需求的变化,核心是让类中每种可能的变化对应地交给抽象类的一个子类去负责,从而让该类的设计者不去关心具体实现。


    2.选择题

    (1)下列哪个叙述是正确的?
    A.子类继承父类的构造方法。
    B.abstract类的子类必须是非abstract类。
    C.子类继承的方法只能操作子类继承和隐藏的成员变量。
    D.子类重写或新增的方法也能直接操作被子类隐藏的成员变量。


    (2)下列哪个叙述是正确的?
    A.final类可以有子类。
    B.abstract类中只可以有abstract方法。
    C.abstract类中可以有非abstract方法,但该方法不可以用final修饰。
    D.不可以同时用final和abstract修饰同一个方法。
    E.允许使用static修饰abstract方法。


    (3)下列程序中注释的哪两个代码(A、B、C、D)是错误的?(无法通过编译)?

    Java
    class Father{
        private int money=12;
        float height;
        int seeMoney(){
            return money;//A
        }
    }
    class Son extends Father{
        int height;
        int lookMoney(){
            int m = seeMoney(); //B
            return m;
        }
    }
    class E{
        public static void main(String args[]){
            Son erzi = new Son();
            erzi.money = 300;   //C
            erzi.height = 1.78F;//D
        }
    }
    

    (4)假设C是B的子类,B是A的子类,cat是C类的一个对象,bird是B类的一个对象,下列哪个叙述是错误的?
    A. cat instanceof B 的值是true。
    B. bird instanceof A的值是true。
    C. cat instanceof A的值是true。
    D. bird instanceof C的值是true。


    (5)下列程序中注释的哪个代码(A、B、C、D)是错误的(无法通过编译)?

    Java
    class A{
        static int m;
        static void f(){
            m = 20;    //A
        }
    }
    class B extends A{
        void f(){    //B
            m = 222;    //C
        }
    }
    class E{
        public static void main(String args[]){
            A.f();    //D
        }
    }
    

    (6)下列程序中注释的哪个代码(A、B、C、D)是错误的?

    Java
    abstract class Takecare{
        protected void speakHello(){}    //A
        public abstract static void cry();    //B
        static int f(){ return 0;}    //C
        abstract float g();    //D
    }
    

    (7)下列程序中注释的哪个代码(A、B、C、D)是错误的(无法通过编译)?

    Java
    abstract class A{
        abstract float getFloat();    //A
        void f()    //B
        { }
    }
    public class B extends A{
        private float m = 1.0f;    //C
        private float getFloat ()    //D
        {
            return m;
        }
    }
    

    (8)将下列哪个代码(A、B、C、D)放入程序中标注的【代码】处将导致编译错误?
    A. public float getNum(){return 4.0f;}
    B. public void getNum(){}
    C.public void getNum(double d){}
    D.public double getNum(float d){return 4.0d;}

    class A{
        public float getNum(){
            return 3.0f;
        }
    }
    public class B extends A{
        【代码】
    }
    

    (9)对于下列代码,下列哪个叙述是正确的?
    A.程序提示编译错误(原因是A类没有不带参数的构造方法)。
    B.编译无错误,【代码】输出结果是0。
    C.编译无错误,【代码】输出结果是1。
    D.编译无错误,【代码】输出结果是2。

    Java
    class A{
        public int i = 0;
        A(int m){
            i=1;
        }
    }
    public class B extends A{
        B(int m){
            i=2;
        }
        public static void main(String args[]){
            B b = new B(100);
            System.out.println(b.i);//【代码】
        }
    }
    

    选择题解析

    9.A
    父类的构造方法不允许被继承,不允许被重写,但在子类的构造过程中必须调用其父类的构造方法,如果子类的构造方法中没有显式的调用父类的构造方法(super关键字),则系统默认调用父类无参的构造方法。如果子类构造方法中既没有显式调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。


    8.B
    方法重写要求方法名,返回值类型,参数完全相同,所以A符合,B返回值类型不同,编译错误。而C和D不仅返回值类型不同,参数也不同,不属于方法重写,而是属于子类自己新增的方法。


    7.D
    方法重写要求重写的方法的访问权限大于等于被重写的方法,父类该方法权限为友好,子类中为私有,所以是错误的。


    6.B
    abstract方法不能用static和private修饰;对于类,不能同时用final和abstract修饰,因为final关键字使得类不可继承,而abstract修饰的类如果不可以继承将没有任何意义。


    5.B
    实例方法是不能重写静态方法的,所以静态方法重写必须是静态方法。


    4.D
    instanceof运算符判断左面的对象是否是右面的类或其子类所创建的。
    cat是C类的对象,而C是B的子类,所以A正确
    bird是B类的对象而B是A的子类,所以B正确
    cat是C类的对象,而C是B的子类,B又是A的子类,所以C正确
    bird是B类的对象,而B是C的父类,所以D错误


    3.CD
    程序声明了Son的对象erzi,去调用money属性赋值,虽然Son继承了Father,但是money是Father的私有变量,是无法继承的,不能够赋值。而且在Son类中声明了一个与Father同名的属性height,此时子类就隐藏了继承的成员变量,调用的时候就是在调用子类自己的成员变量height,因为是int型,无法被赋值给float型,所以C和D是错误的。


    2.D
    用final修饰的类是不允许被继承的,A错误
    abstract类中也可以有普通成员方法,B错误
    abstract类中的非abstract方法是可以用final修饰的,而abstract方法是不可以被final修饰的,C错误
    D同上,所以正确
    不允许使用static修饰abstract方法,E错误。


    1.C
    子类是不继承父类的构造方法的,而是必须调用其父类的构造方法。
    abstract类的子类可以是abstract类,如果是非abstract类,就必须重写父类中所有的abstract方法。
    D中子类新增的方法是不能直接操作被子类隐藏的成员变量的。

    展开全文
  • 该文件是数独软件,可以用于解决4*4及5*5数独问题,方便快捷!
  • 5. 数据库题(以个人熟悉数据库为准、按要求写出sql) (1) 计算每个人的总成绩并排名(要求显示字段:学号,姓名,总成绩) (2) 计算每个人单科的最高成绩(要求显示字段: 学号,姓名,课程,最高成绩) (3) 列出...
  • keil(MDK) 5官方下载教程

    万次阅读 2019-05-23 19:23:21
    一、KEIL Keil公司是一家业界领先的微控制器(MCU)软件开发工具的独立供应商。Keil公司由两家私人公司联合运营,分别是德国慕尼黑的Keil Elektronik GmbH和美国德克萨斯的Keil Software Inc。...
  • matlab 5*5十字型窗口中值滤波源代码
  • VMWare ESXi 5.5安装及配置

    千次阅读 2019-05-14 09:10:20
    VMWare ESXi 5.5安装大概过程如下:制作虚拟化ESXi系统的USB启动盘,安装ESXi系统到USB,用USB启动ESXi系统。比较难理解,下面图解过程。 下载UNetbootin (下载地址:... ......
  • import java.util.Scanner; public class sum{ public static void main( String args[]){ Scanner s = new Scanner(System.in);... System.out.println("==计算一个数的各个位数之和==");...
  • 需求说明: 编写Java程序,输入一个五位数字,计算各位数字之和并输出,运行结果为五个数字之和。 实现思路: (1)声明变量num,用于存储用户输入的... 个位:12345%10=5 十位:12345/10=1234 1234%10...
  • Unicode的编码方式参见: ...十进制 十六进制 字符数 编码分类(中文) 编码分类(英文) 起始 终止 起始 终止 (个) 0 127 0000 007F 128 C0控制符及基本拉丁文 C0 Control and Basic Latin 128 255 0080 00FF 128 ...
  • C语言-经典习题案例

    2019-08-01 15:38:40
    1、对int a[]={25,24,12,76,98,101,50,28}数组进行排序。 int i=0,j=0,temp=0,a[]={25,24,12,76,98,101,50,28}; while(i<sizeof(a)/4){ for(j=0;j<sizeof(a)/4-i-1;){ if(a[j]<......
  • ���淶��Ŀ�ģ����Լ��Ĵ���һ��ͳһ����׼����ۣ���ǿ�ɶ��ԣ�������ԣ���ά�...�ο���borland�ٷ�object pascal���ָ�� delphi5����Աָ�ϱ����׼ 
  • 跟我一起学extjs5(01--开发的总体说明)

    万次阅读 多人点赞 2015-07-30 08:34:57
    跟我一起学extjs5(01--开发的总体说明)  我之前使用extjs4+java spring MVC架构了一套“模块常规功能自定义的系统”(博客详见点击打开链接),该系统中详细讲解了设计思想,但并未有实现过程。由于extjs5的...
  • TP5 中引入第三方类库

    万次阅读 2017-10-21 17:53:50
    通过了解tp5的目录结构,我们知道其中有两个目录是纺织扩展类库文件的。 extend是放置自定义或者其他类文件的。 vendor目录是放置composer类库文件的。 当我们的第三方类库文件是下载的,而且类文件目录一层又一层,...
  • Java 加解密技术之 MD5

    万次阅读 2016-12-15 22:00:21
    这篇文章继续加解密的系列,当然也是介绍比较基础的加密方式 — — MD5,MD5 属于单向加密算法,是不可逆的加密方式,也就是说,采用了 MD5 加密方式加密之后,就不能对加密的结果进行解密,得到原有的字符串,这是...
  • 为什么5*5卷积等价于两个3*3卷积

    千次阅读 2018-03-06 10:13:26
    inceptionv3里模型参数压缩方面,提到的这个方法,比如,一个原始矩阵是2*3,卷积核是3*3,那么卷积结果是4*5的矩阵 一个4*5的矩阵继续和3*3的卷积核卷积,结果是6*7的矩阵2*3的直接和5*5的卷积,结果是6*7的矩阵。...
  • PBEWithMD5AndDES算法

    千次阅读 2016-07-16 12:03:16
    PBEWithMD5AndDES算法 一、算法的比较 对于像对url中的参数进行加密或者get提交方法的加密过程,我不建议使用rsa或者是三重des这样的加密算法,主要原因在于性能和速度会受影响。 (1)我建议大家使用对称加密如:DES...
  • 当前浏览器对HTML5支持状况(全平台)

    万次阅读 2015-08-24 19:14:53
    题记HTML5test 这个网站专门测试浏览器对HTML5支持状况,只要你的浏览器打开HTML5test这个页面,就会得到一个测评的分数,然后会列出你当前浏览器对哪些特性支持良好,哪些不支持简易测试如图:360极速浏览器测试的(内核...
1 2 3 4 5 ... 20
收藏数 13,792,347
精华内容 5,516,939
关键字:

5