统计字典序元音字符串的数目

1641. 统计字典序元音字符串的数目

题目:

给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。

字符串 s 按字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i+1] 相同或在 s[i+1] 之前。

动态规划/递归

找规律。

列出简单样例,通过列出简单样例同时观察其前后是否存在关联

注意题设:限定字母出现的位置 如 e 不能出现在a前

思路

写n=2 时 规律可能并不明显,例子较少, 当写到n=3 时 发现此时 由a开头的所有字符串 为 n=2的数量。

原因:以a开头 后续能接上任意的 a e i o u

再观察以e开头的 发现能接上 e i o u

那么关系式就出来了

[x]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31



加头

```java
class Solution {
public int countVowelStrings(int n) {
// int a=1,e=1,i=1,o=1,u=1;
// for(int j=1;j<n;j++){
// a=a+e+i+o+u;
// e=e+i+o+u;
// i=i+o+u;
// o=o+u;
// u=u;
// }
// return a+e+i+o+u;

int[] [] t = new int [n][5];
t[0][0]=1; t[0][1]=1; t[0][2]=1; t[0][3]=1; t[0][4]=1;

for(int i =1;i<n;i++){
t[i][0]=t[i-1][0]+t[i-1][1]+t[i-1][2]+t[i-1][3]+t[i-1][4];
t[i][1]=t[i-1][1]+t[i-1][2]+t[i-1][3]+t[i-1][4];
t[i][2]=t[i-1][2]+t[i-1][3]+t[i-1][4];
t[i][3]=t[i-1][3]+t[i-1][4];
t[i][4]=t[i-1][4];
}
return t[n-1][0]+t[n-1][1]+t[n-1][2]+t[n-1][3]+t[n-1][4];
}
}

加尾

与 加头 基本类似 主体思路为 长度为n 的 字符串 与 n - 1 的关系

观察得 1. 末尾以 a 结尾的 n-1 中满足条件的一定以 a 结尾

               2.  末尾以 e 结尾的 n-1 中满足条件的为 以  a e 结尾的字符串
               3.   末尾以 i 结尾的 n-1 中满足条件的为 以  a e i  结尾的字符串
               4.   末尾以 o 结尾的 n-1 中满足条件的为 以  a e i o 结尾的字符串
               5.   末尾以 u 结尾的 n-1 中满足条件的为所有的字符串
a e i o u 数量 n
1 1 1 1 1 5 1
1 2=1+1 3=1+1+1 4=1+1+1+1 5=1+1+1+1+1 15 2
1 3=1+2 6=1+2+3 10=1+2+3+4 15=1+2+3+4+5 35 3
1 5=1+4 10=1+3+6 20=1+3+6+10 35=1+3+6+10+15 70 4

递归表达式: t[i][x]= t[i-1][0]+...t[i-1][x]

解释 当结尾为 x 时 i-1 长度的 字符串 结尾为 0-x 的 都可以在末尾添加 x 来获得长度为i 并且以x结尾的字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int countVowelStrings(int n) {
int[] [] t = new int [n][5];
t[0][0]=1; t[0][1]=1; t[0][2]=1; t[0][3]=1; t[0][4]=1;

for(int i =1;i<n;i++){
t[i][4]=t[i-1][0]+t[i-1][1]+t[i-1][2]+t[i-1][3]+t[i-1][4];
t[i][3]=t[i-1][0]+t[i-1][1]+t[i-1][2]+t[i-1][3];
t[i][2]=t[i-1][0]+t[i-1][1]+t[i-1][2];
t[i][1]=t[i-1][0]+t[i-1][1];
t[i][0]=t[i-1][0];
}
return t[n-1][0]+t[n-1][1]+t[n-1][2]+t[n-1][3]+t[n-1][4];
}
}

由于 所求的 字符串长度 已经固定,并且有强制的前后顺序, 所有当 a e i o u 数量固定时,字符串存在且唯一。

将问题转化为 a e i o u 的各个元音字符的数量

a e i o u 数量 n
1 1 1 1 1 5 1
1 2 3 4 5 15 2
1 3 6 10 15 35 3
1 5 10 20 35 70 4

github图片仓库的创建以及使用

使用流程

  1. 创建github仓库 (网络教程很多 不细说)

  2. 建立完 ,将项目clone到本地

  3. 在本地电脑中,寻找/创建一个合适的文件夹,将项目clone下来

    在Git bash 中运行 指令: git clone SSH

    图片

  4. 新建文件夹 并添加图片

  5. 在项目根目录 打开Git Bash 依次输入代码

    1
    2
    3
    git add .
    git commit -am 第一次添加图片
    git push
  6. 成功后回 github仓库中 即可查看到新添加的图片

  7. 进入仓库中 ,打开图片 对 图片右键,点击 复制图片地址 在markdown中 使用方式

    ![图片介绍可不写] ( 图片地址)

遇到问题

一. github 仓库 图片 裂开 无法显示 无法获取图片地址

进入C:\Windows\System32\drivers\etc\hosts 打开添加 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# GitHub Start 
140.82.113.3 github.com
140.82.114.20 gist.github.com

151.101.184.133 assets-cdn.github.com
151.101.184.133 raw.githubusercontent.com
199.232.28.133 raw.githubusercontent.com
151.101.184.133 gist.githubusercontent.com
151.101.184.133 cloud.githubusercontent.com
151.101.184.133 camo.githubusercontent.com
199.232.96.133 avatars.githubusercontent.com
151.101.184.133 avatars0.githubusercontent.com
199.232.68.133 avatars0.githubusercontent.com
199.232.28.133 avatars0.githubusercontent.com
199.232.28.133 avatars1.githubusercontent.com
151.101.184.133 avatars1.githubusercontent.com
151.101.108.133 avatars1.githubusercontent.com
151.101.184.133 avatars2.githubusercontent.com
199.232.28.133 avatars2.githubusercontent.com
151.101.184.133 avatars3.githubusercontent.com
199.232.68.133 avatars3.githubusercontent.com
151.101.184.133 avatars4.githubusercontent.com
199.232.68.133 avatars4.githubusercontent.com
151.101.184.133 avatars5.githubusercontent.com
199.232.68.133 avatars5.githubusercontent.com
151.101.184.133 avatars6.githubusercontent.com
199.232.68.133 avatars6.githubusercontent.com
151.101.184.133 avatars7.githubusercontent.com
199.232.68.133 avatars7.githubusercontent.com
151.101.184.133 avatars8.githubusercontent.com
199.232.68.133 avatars8.githubusercontent.com
199.232.96.133 avatars9.githubusercontent.com

# GitHub End

然后保存文件就OK了,至于无法保存,没有修改权限,鼠标右键-属性-安全-修改权限;或将hosts文件复制一份,修改之后,复制到原文件夹替换!

( 可以 运行 记事本 然后右键 以管理员身份运行就可以保存了 不然没有权限)

保存后 win+R 运行 ipconfig/flush 刷新一下 回去github仓库就发现可以看到图片了

IDEA快捷键备忘录

IDEA 常用快捷键

Ctrl+b弹出源码。

Ctrl+Q 快速查找文档

image-20210826153912383

Ctrl+O 覆盖方法

快捷键总和

1.IDEA提高效率的快捷键

Ctrl+N 快速打开任何类文件.

Ctrl+Shift+N 快速打开任何文件.

Ctrl+Shift+F12 最大化代码窗口和最小化代码窗口来回切换.

Ctrl+Space 代码自动补全

Alt+F7 查找光标所位置的类、方法、变量,在整个项目中使用特定类、方法或变量的所有位置。

Crtl+P 快速查看在编辑器的光标处使用的类或方法的文档。

2.IDEA编辑快捷键

Ctrl+Space 基本代码补全,包括任何类,任何方法,任何变量。

Ctrl+Shift+Space 智能代码补全(按预期类型筛选方法和变量列表)

Ctrl+Shift+Enter 完整的语句

Ctrl+P 查看方法参数信息

Ctrl+Q 快速查找文档

Shift+F1 IDEA的外部文档

Ctrl+ mouse 查看代码的信息

Ctrl+F1 显示错误或警告的描述

Alt+Insert 生成代码,包含:Getters, Setters, Constructors, hashCode/equals, toString

Ctrl+O 覆盖方法

Ctrl+I 实现接口中的方法

Ctrl+Alt+T 选择条件语句 (if..else, try..catch, for, synchronized, etc.)

Ctrl+/ 用行注释注释/取消注释

Ctrl+Shift+/ 块注释/取消注释

Ctrl+W 选择代码块,每按一次则不断像外扩张

Ctrl+Shift+W 与上面相对应,不断缩小选择范围。

Alt+Q 上下文信息

Alt+Enter 显示意图、行动和快速修复

Ctrl+Alt+L 重新格式化代码

Ctrl+Alt+O 优化imports

Ctrl+Alt+I 自动缩进

Tab/Shift+Tab 缩进或者取消缩进已选择的行

Ctrl+X/Shift+Delete 将当前行或选定块剪切到剪贴板

Ctrl+C/Ctrl+Insert 将当前行或选定的块复制到剪贴板

Ctrl+V/Shift+Insert 从剪贴板粘贴

Ctrl+Shift+V 从最近的缓冲区粘贴。

Ctrl+D 重复当前行或选定块

Ctrl+Y 删除光标所在的行

Ctrl+Shift+J 智能合并

Ctrl+Enter 智能拆分

Shift+Enter 新的行

Ctrl+Shift+U 为光标或选定块的单词切换大小写

Ctrl+Shift+]/[ 选择till代码块结束/开始

Ctrl+Del 删除光标后的字符串,会自动判断。

Ctrl+backspace 快速向前删除,会自动判断。

Ctrl+ 加号/减号 展开/折叠代码块

Ctrl+Shift+加号/减号 展开所有/折叠所有代码块

Ctrl+F4 关闭活动编辑器选项卡

Alt+F7/Ctrl+F7 查找在哪里使用/查找文件中的在哪里使用

Ctrl+Shift+F7 高亮显示文件用到的地方,例如变量、方法

Ctrl+Alt+F7 显示用到的地方

F5 复制

F6 移动

Alt+Delete 安全删除

Shift+F6 重命名文件

Ctrl+F6 更改签名

Ctrl+Alt+N Inline

Ctrl+Alt+M 提取方法

Ctrl+Alt+V 提取变量

Ctrl+Alt+F 提取字段

Ctrl+Alt+C 提取常量

Ctrl+Alt+P 提取参数

3.IDEA搜索和替换快捷键

双击Shift 在整个项目中搜索文本、文件

Ctrl+F 当前文件查找

F3/Shift+F3 查找下一个或者上一个

Ctrl+R 替换当前文件的某个字段

Ctrl+Shift+F 在项目中查找文本

Ctrl+Shift+R 在项目中替换文本

4. IDEA编译和运行快捷键

Ctrl+F9 Make项目(编译修改和依赖)

Ctrl+Shift+F9 编译选定的文件、包或模块

Alt+Shift+F10 选择配置并运行

Alt+Shift+F9 选择配置和调试

Shift+F10 运行

Shift+F9 Debug

Ctrl+Shift+F10 从编辑器运行上下文配置

5.IDEA debug调试快捷键

Ctrl+K Commit项目到VCS

Ctrl+T 从VCS更新项目

Alt+Shift+C 查看最近的更改

Alt+` 快速弹出VCS

F8 步出

F7 步进

Shift+F7 智能步进

Shift+F8 智能步出

Alt+F9 定位到光标地方

Alt+F8 计算表达式

F9 回复程序

Ctrl+F8 切换断点

Ctrl+Shift+F8 查看断点

6.IDEA实时代码模板快捷键快捷键

Ctrl+Alt+J 环绕活动模板

Ctrl+J 插入实时代码模板

Ctrl+J - iter 按照Java SDK 1.5的风格进行迭代

Ctrl+J - inst 用instanceof检查对象类型并向下转换它

Ctrl+J - itco Iterate Collection /迭代java.util.Collection的元素

Ctrl+J - itit Iterate Itterator / IIterate elements of java.util.Iterator

Ctrl+J - itli Iterate List /迭代java.util.List的元素

Ctrl+J - psf Public static final

Ctrl+J - thr throw new

7.IDEA导航快捷键

Ctrl+N 搜索类

Ctrl+Shift+N 搜索文件

Ctrl+Alt+Shift+N 搜索符号,不知道怎么用

Alt+ Right/Left 转到下一个/上一个编辑器选项卡

F12 回到上一个工具窗口

Esc 进入编辑器(从工具窗口)

Shift+Esc 隐藏活动窗口或上次活动窗口

Ctrl+Shift+F4 关闭活动运行/信息/查找/…的选项卡

Ctrl+G Go to line

Ctrl+E 最近文件弹出

Ctrl+Alt+Arrow 左/箭头向右向后/向前导航

Ctrl+Shift+Backspace 导航到最后一个编辑位置

Alt+F1 在任何视图中选择当前文件或符号

Ctrl+B/Ctrl+ 点击去声明

Ctrl+Alt+B 去实现

Ctrl+Shift+I 打开快速定义查找

Ctrl+Shift+B 转到类型声明

Ctrl+U 父类方法/超类

Alt+Arrow 向上/向下转到上一个/下一个方法

Ctrl+]/[ 移动到代码块结束、移动到代码块开始

Ctrl+F12 弹出文件结构

Ctrl+H 类型层次结构

Ctrl+Shift+H 方法层次结构

Ctrl+Alt+H 调用层次结构

F2/Shift+F2 上一个高亮的错误/下一个高亮错误

F4/Ctrl+Enter 编辑资源/查看资源

Alt+Home 显示导航栏

F11 切换书签

Ctrl+F11 切换书签与助记符

Ctrl+0…9 定位书签

Shift+F11 显卡书签

8. IDEA常用快捷键

Alt+0…9 打开相应的工具窗口

Ctrl+S 保存所有

Ctrl+Alt+Y 同步

Ctrl+Shift+F12 最大化切换编辑器

Alt+Shift+F 添加到收藏夹”

Alt+Shift+I 用当前配置文件检查当前文件

Ctrl+` 快速切换当前方案

Ctrl+Alt+S 打开设置对话框

Ctrl+Alt+Shift+S 打开项目结构对话框

Ctrl+Shift+A Find Action

Ctrl+Tab 在选项卡和工具窗口之间切换

Ctrl+Shift+Alt+Insert 创建新的划痕文件

9. IDEA多处选择快捷键

Alt+Shift+点击鼠标 添加或者删除一个选择

Alt+J 选择下一个事件

Shift+Alt+J 取消选择下一个事件

Shift+Ctrl+Alt+J 选择所有事件

Esc 取消所有选择

git操作

git init 初始化git生成git仓库
git log 查看日志 码 可只取 前7位
git status 查看git状态
git add filename添文件到暂存区
git add .加入所有文件到暂存区
git commite -m message提交文件到本地仓库
git reset filename将尚没有commite之前加入到暂存区的文件重新拉回
git checkout 取消操作 (还没add入缓存区)

安卓-广播的最佳实践

5.5广播的最佳实践

演示效果

让我看看更新了没

git演示

![](D:\图库\markdown\广播的最佳实践.gif

主体代码与 第一行代码 中 相同 修改部分判断条件来达到不同的提示 以及 账号密码 是否正确的判断 (修改LoginActivity中代码)

代码
ActivityCollector
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ActivityCollector {

private static List<Activity> activities = new ArrayList<Activity>();

public static void addActivity(Activity activity) {
activities.add(activity);
}

public static void removeActivity(Activity activity) {
activities.remove(activity);
}

public static void finishAll() {
for (Activity activity : activities) {
activity.finish();
}
}
}
BaseActivity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class BaseActivity extends AppCompatActivity {

private ForceOfflineReceiver receiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}

@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE");
receiver = new ForceOfflineReceiver();
registerReceiver(receiver,intentFilter);
}

@Override
protected void onPause() {
super.onPause();
if(receiver != null){
unregisterReceiver(receiver);
receiver = null;
}
}

@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}

class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("warning");
builder.setMessage(" 拜拜了您勒");
builder.setCancelable(false);
builder.setPositiveButton("OJBK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll();
Intent i = new Intent(context,LoginActivity.class);
context.startActivity(i);
}
});
builder.show();
}
}
}
LoginActivity

想到达到不同账号密码进行登陆,需要修改onClick中的代码 主要为 判断条件 即 判断 账号 和密码 的值 是否与你预设的相符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class LoginActivity extends BaseActivity {
private EditText accoutEdit;
private EditText passwordEdit;
private Button login;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);

accoutEdit=(EditText) findViewById(R.id.accout);
passwordEdit=(EditText) findViewById(R.id.password);
login = (Button) findViewById(R.id.login);

login.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
String account = accoutEdit.getText().toString();
String password = passwordEdit.getText().toString();
if(account.equals("") || password.equals("")){
Toast.makeText(LoginActivity.this,"请输入完整的内容",Toast.LENGTH_SHORT).show();
}
if(account.equals("gzh666") && password.equals("123456")){
Intent intent = new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
finish();
}else {
Toast.makeText(LoginActivity.this," 密码或者账号错误",Toast.LENGTH_SHORT).show();
}


}
});
MainActivity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MainActivity extends BaseActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button forceOffline = (Button) findViewById(R.id.force_offline);
forceOffline.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE");
sendBroadcast(intent);
}
});

}
}
activity_login.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/b">

<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="60dp">

<TextView
android:layout_gravity="center_vertical"
android:layout_width="90dp"
android:layout_height="wrap_content"
android:text="账号:"
android:textSize="18sp"/>
<EditText
android:id="@+id/accout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"/>
</LinearLayout>

<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="60dp">

<TextView
android:layout_gravity="center_vertical"
android:layout_width="90dp"
android:layout_height="wrap_content"
android:text="密码:"
android:textSize="18sp"/>
<EditText
android:id="@+id/password"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:inputType="textPassword"/>
</LinearLayout>

<Button
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="登陆"/>

</LinearLayout>
activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/b"
>

<Button
android:id="@+id/force_offline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="下机下机 回家睡觉"/>



</LinearLayout>

167.两数之和II

167. 两数之和 II - 输入有序数组

题目信息: 升序 , 答案唯一,不可使用重复元素。

1
2
3
4
5
6
示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

使用双指针。 left,right 分为指向数组头尾。

判断 二者之和(numbers[left]+numbers[right])与目标值的小大比较。

​ 相等则输出

​ 小于 : 将二者和变大 left+1;

​ 大于 : 将二者和变小 right-1;

​ *** 由于numbers的小标由1开始计数,则返回时 left +1,right+1;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int[] twoSum(int[] numbers, int target) {
int left=0,right=numbers.length-1;
while( numbers[left]+numbers[right] != target){
if( (numbers[left]+numbers[right])>target ){
right--;
}else if((numbers[left]+numbers[right])<target){
left++;
}else {
return new int[]{left+1,right+1};
}
}
return new int[]{left+1,right+1};
}
}

第一次try

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试

这是我的第一次尝试
这是我的第一次尝试
这是我的第一次尝试
这是我的第一次尝试
这是我的第一次尝试
这是我的第一次尝试

  • Copyrights © 2021 高志宏
  • 访问人数: | 浏览次数:

贫穷蒙蔽了我的双眼

支付宝
微信