welcome


  • 首页

  • 归档

  • 标签

  • 关于

  • 搜索

【leetcode】 859 Buddy Strings

发表于 2018-09-08

描述
这道题交换两个字符后相等

我的做法

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
56
57
58
59
class Solution {
public:
bool buddyStrings(string A, string B) {
if (A.length() != B.length())//长度不同直接返回false
{
return false;
}
int strLength = A.length();
if (A==B)//字符串一样直接返回true
{
//存在两个相同的字符才可以
for (int i = 0; i < strLength; i++)
{
for (int j = i + 1; j < strLength; j++)
{
if (A.at(i) == A.at(j))
{
return true;
}
}
}

return false;
}

int ind1, ind2;//能成功的必须只有两处不同
int flag = 0;
for (int i = 0; i < strLength; i++)
{
if (A.at(i) != B.at(i))
{
flag++;
if (flag == 1)
{
ind1 = i;
}
else if (flag == 2)
{
ind2 = i;
}
else
{
return false;
}
}
}
int temp_val = A.at(ind1);
A.at(ind1) = A.at(ind2);
A.at(ind2) = temp_val;
if (A == B)
{
return true;
}
else
{
return false;
}
}
};

大佬做法

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
class Solution {
public:
bool buddyStrings(string A, string B) {
if (A.length() != B.length()) {
return false;
}
if (A.length() < 2) {
return false;
}
bool bRpeat = false;
bool map[26] = {false};
int diffCnt = 0;
int ind[2];
for (int i = 0; i < A.length(); i++)
{
if (map[A[i] - 'a']) { bRpeat = true; }
map[A[i] - 'a'] = true;
if (A[i] != B[i]) {
if (diffCnt >= 2) { return false; }
ind[diffCnt++] = i;
}

}
if (diffCnt == 0 && bRpeat) { return true; }
return A[ind[0]] == B[ind[1]] && A[ind[1]] == B[ind[0]];
}
};

**参考资料*
[原题链接](https://leetcode.com/problems/buddy-strings/description/)

2018年9月8日

发表于 2018-09-08

重新安装了hexo+gitpage

步骤

  • 安装node.js
  • 安装hexo
  • git链接github
  • git添加远程库
  • git clone -b youbranch [rep]
  • 将_config.yml,source,themes文件夹替换成之前文件

遇到了一些问题

1
npm ERR! Maximum call stack size exceeded

原因是因为下载到一半就中断了,可以删除文件夹中的node_modules,然后在git bash中运行npm install 就可以变为初始状态。node_modules应该是类似于模块一样的东西。

Google+stackoverflow 可以解决95%的编程问题

有这种感觉,这上面搜索出来的东西往往比较可靠,没有那么多广告。

重新安装了一下Ubuntu18.04

仍然需要在开启界面将quiet splash 替换成 nomodeset,具体可以参考这篇文章,其中安装nvidia-390会有一些问题,可以参考这篇文章,之后安装ss-qt5,参考这篇文章,配置Google浏览器代理,可以参考这篇文章和这篇文章。

一些数据结构题

发现leetcode这个编程网站比较优秀,相对之前的浙江大学poj和北京大学poj对新手好一些。有时间的对比,有详细的答案代码可以参考。emm,目前都是挑的简单题做的。

数学建模

这玩意儿还真的要点技术。另外,matlab可真是简单粗暴。有点遗憾,但是也取得了不少收获,至少编程能力和数据分析能力提高了不少,以及眼界也开阔了不少,可见这样是实战对能力的成长还是大有帮助的。

图片问题

1
2
3
![](./2018-9-8/a.png) 没有用了
要换成
![](2018-9-8/a.png)

ChaZD查词

这是一个非常好用的在线英语查词谷歌插件

一点小感想

发表于 2018-09-07
最近看了一些大佬的博客,真是太牛逼了。

参加了数学建模,发现自己编程实力实在菜的一匹。

数据结构是真的重要,需要好好复习一下。

遇到一些问题,不能太钻牛角尖,有很多东西是不必要那么认真的。这样就会有够多的时间了。

一个人的力量总是渺小的,需要向优秀的人学习询问方法,不要闭门造车。

要开阔眼界,多看书,多看技术书,要养成看技术书的习惯.

MFC 总结

发表于 2018-06-25

更换按钮caption

1
2
this->GetDlgItem(IDC_BT_WAIT)->SetWindowText(L"暂停游戏");
this->GetDlgItem(IDC_BT_WAIT)->SetWindowText(L"继续游戏");

使按钮处于非点击状态

1
this->GetDlgItem(IDC_BT_NORMAL_SET)->EnableWindow(false);

如何判断拐点

1
2
3
4
5
6
7
8
9
10
11
12
//利用等差数列
bool CGameLogic::IsCorner()
{
if (m_nVertTexNum >= 3)
{
if ((m_avPath[m_nVertTexNum - 1] + m_avPath[m_nVertTexNum - 3]) / 2 != m_avPath[m_nVertTexNum - 2])
{
return true;
}
}
return false;
}

深度优先搜索,核心算法

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
bool CGameLogic::SearchPath(CGraph &g ,int nV0,int nV1)
{
//得到顶点数
int nVexNum = g.GetVertNum();

//遍历途中nV0行,从0列到nVexMax列,值为true的点
for (int nVi = 0; nVi < nVexNum; nVi++)
{
if (g.GetArc(nV0, nVi) == true && !IsExit(nVi))
{
//压入当前点,假设为路径的一个有效顶点
PushVertTex(nVi);
if (m_nCornerNum > 2)
{
PopVertTex();
continue;
}

//当中间点不是nV1时,继续搜寻下一个相邻且连通的点
if (nVi != nV1)
{
//当中间点不为空时,表示该路径不通
if (g.GetVertex(nVi) != BLACK)
{
//取出压入点
PopVertTex();
continue;
}

//如果nV1是一个已经消除的点,则判断(nV1和nV1)是否连通
if (SearchPath(g, nVi, nV1))
{
//为true表示找到一条连通路径
return true;
}
}
//搜索到终点
else
{
return true;
}
PopVertTex();
}
}

return false;
}

进度条的使用

1
2
3
4
5
6
7
//初始进度条
m_gameProcess.SetRange(0, 5 * 60);
//设置步长
m_gameProcess.SetStep(-1);
//初始值
m_gameProcess.SetPos(300);
this->SetTimer(12,1000,NULL);
1
2
3
4
5
6
7
8
9
10
11
12
13
void CGameDlg::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == 12)
{
int pos=m_gameProcess.GetPos();
drawFont(pos);
//m_time--;
//m_gameProcess.SetPos(pos - 1);
m_gameProcess.StepIt();
}

CDialogEx::OnTimer(nIDEvent);
}

效果

快速排序

发表于 2018-06-13
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
function quickSort
a = [2,0,1,8,6,13];
num=size(a,2);
c = quickSort1(a,1,num);
disp(c);
end

function a=quickSort1(a,aStart,aEnd)
if aStart >= aEnd
return ;
end
index = a(aStart);
i = aStart,j = aEnd;
while i<j
while a(j)>=index && i<j
j=j-1;
end
a(i)= a(j);
while a(i)<=index && i<j
i=i+1;
end
a(j)= a(i);
end
a(i) = index;
a=quickSort1(a,aStart,i-1);
a=quickSort1(a,i+1,aEnd);

end

感觉更为简洁

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
#include<stdio.h>

void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}

void quickSort(int a[], int aStart, int aEnd)
{
if (aStart >= aEnd)
{
return;
}
int midvalue = a[aEnd];
int i = aStart - 1;
for (int j = aStart; j <= aEnd-1; j++)
{
if (a[j] <= midvalue)
{
i++;
swap(&a[j],&a[i]);
}
}
swap(&a[i+1], &a[aEnd]);

quickSort(a, aStart, i + 1 - 1);
quickSort(a, i + 1 + 1, aEnd);
}

void printArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
printf("%d\t", a[i]);
}
printf("\n");
}

int main()
{
int a[] = { 1,4,3,2 };
int n = sizeof(a) / sizeof(a[0]);
printArray(a, n);
quickSort(a, 0, n - 1);
printArray(a, n);

}

MFC贪吃蛇

发表于 2018-06-13

窗口大小

1
2
3
4
5
6
//添加到OnInitDialog函数中去
GetWindowRect(window);//
GetClientRect(client);//
int width = window.Width() - client.Width() + LENGTH * SIZE_H;
int height = window.Height() - client.Height() + LENGTH * SIZE_H;
MoveWindow(0, 0, width, height);

计时器

打开某个类类向导,添加消息,OnTimer编辑代码,写入按照计时器运行的内容

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
void CSnake2Dlg::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent)
{
case 1: //定时器1处理函数,定时发送数据进行更新
{
snakeMove();
break;
}

case 2: //定时器2位为状态栏时间信息
{
snakeMove();
break;
}
}

CDialogEx::OnTimer(nIDEvent);
}




//开始1号计时器
SetTimer(1, 200, NULL);

//结束1号计时器
KillTimer(1);

按键控制

类向导->虚函数->pretranslate实现控制

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
BOOL CSnake2Dlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case VK_UP:
m_snake.dirctionChange(CPoint(0,-1));
break;
case VK_DOWN:
m_snake.dirctionChange(CPoint(0, 1));
break;
case VK_LEFT:
m_snake.dirctionChange(CPoint(-1, 0));

break;
case VK_RIGHT:
m_snake.dirctionChange(CPoint(1, 0));

break;

default:
break;
}
}

return CDialogEx::PreTranslateMessage(pMsg);
}

链表

1
2
3
4
5
6
7
8
9
10
CList <CPoint> body;//链表类型
body.GetHead();//得到头节点
body.GetTail();//得到尾节点
body.GetHeadPosition();//返回位置

body.Add
POSITION p;//感觉有点向迭代器

//得到下一个节点
CPoint point =body.GetNext(p);

画矩形

1
2
3
4
CClientDC dc(this);
CBrush red(RGB(255, 0, 0));
dc.SelectObject(red);
dc.Rectangle(m_ptFood.x*LENGTH, m_ptFood.y*LENGTH, (m_ptFood.x + 1)*LENGTH, (m_ptFood.y + 1)*LENGTH);

画直线

1
2
3
4
5
6
7
8
CClientDC dc(this);
CPen pen;

pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
CPen *oldPen = dc.SelectObject(&pen);
dc.MoveTo(0, 0);//起点
dc.LineTo(0, 600);//终点
dc.SelectObject(oldPen);

OnPaint

什么时候调用?
1、由其他窗口遮挡、移动窗口等动作的时候系统会发送
2、你自己想更新某个区域可以发送Invalidate或InvalidRect,再加上UpdateWindow()也可以触发

设计思想

1、建立一个对话框
2、创建Point类型变量代表食物,并且作为对话框的成员变量
3、随机生成食物,绘制食物
4、建立蛇类,作为对话框类的成员
5、添加蛇类CList成员变量,以及代表方向CPoint成员变量
  (CPoint类型的坐标含义为到下一方向作加法,(0,-1)代表纵坐标减1,即向上移动)
6、添加碰撞检测(比较两个点是否相同)
7、重绘蛇和食物

遇到的bug

1、消除边界
原因:消除蛇尾巴的时候清除
纠正方法:重画边界

2、蛇撞到自己的身体
原因:按键速度和蛇移动速度不匹配
纠正方法:当按下键的时候,键盘控制蛇移动,其他时候定时器控制

3、按键一直咚咚咚亮
改正方法:

1
return CDialogEx::PreTranslateMessage(pMsg);

换成

1
return false;

学习于:kekehui

《连连看》- 位图、文字输出

发表于 2018-05-28

显示文字

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
void CLLKDlg::OnPaint(){
CPaintDC dc(this);

//创建字体
CFont font;
font.CreatePointFont(200, L"Cambria");
CFont * oldFont;
oldFont = dc.SelectObject(&font);

//设置字体颜色
dc.SetTextColor(RGB(0, 0, 255));

//获取字体位置
CRect rect;
GetClientRect(&rect);

//字体内容
CString strText = L"Welcom to LLK-GAME!";
CSize size;
size = dc.GetTextExtent(strText, strText.GetAllocLength());

//居中显示
int x = (rect.Width() - size.cx) / 2;
int y = (rect.Height() - size.cy) / 2;
dc.TextOut(x, y, strText);
}


显示位图



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void CLLKDlg::OnPaint(){
//额外添加在自动生成的else里面
CPaintDC dc(this);

//将内存DC复制到视频DC,内存DC在头文件类中定义
dc.BitBlt(0, 0, 800, 600, &m_DCMem, 0, 0, SRCCOPY);
}

//此函数为自定义函数,在头文件中添加
void CLLKDlg::InitBackground() {
//加载位图
CBitmap bmpmain;
bmpmain.LoadBitmap(IDB_MAIN_BG);

//创建兼容dc
CClientDC dc(this);
m_DCMem.CreateCompatibleDC(&dc);

//将位图选进dc
m_DCMem.SelectObject(&bmpmain);
}

以下方式能完成功能
1、保存背景图片在m_dcBG
2、以后可以利用m_dcBG完成对m_dcMem的刷新,进而刷新视频dc
发现m_dcMem和m_dcBG是为同一个视频dc创建的兼容dc

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
void CGameDlg::InitBackground() {
//::是调用API,加载位图

//获得当前视频dc
CClientDC dc(this);

//加载bmp图片
HANDLE bmp = ::LoadImage(NULL, _T("res\\theme\\picture\\game_bg.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

//创建与视频内存兼容DC
m_dcBG.CreateCompatibleDC(&dc);

//将位图资源选进DC
m_dcBG.SelectObject(bmp);

//初始化内存DC
m_dcMem.CreateCompatibleDC(&dc);
CBitmap bmpMem;
bmpMem.CreateCompatibleBitmap(&dc,800,600);
m_dcMem.SelectObject(bmpMem);

//绘制背景到内存中
m_dcMem.BitBlt(0, 0, 800, 600, &m_dcBG, 0, 0,SRCCOPY);
}

void CGameDlg::UpDateMap()
{
int nTop = m_ptGameTop.y;
int nLeft = m_ptGameTop.x;
int nElemW = m_sizeElement.cx;
int nElemH = m_sizeElement.cy;

m_dcMem.BitBlt(m_rtGameRect.left, m_rtGameRect.top, m_rtGameRect.Width(), m_rtGameRect.Height(), &m_dcBG, m_rtGameRect.left, m_rtGameRect.top, SRCCOPY);

for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (m_anMap[i][j] != -1)
{
m_dcMem.BitBlt(nLeft + j * nElemW, nTop + i * nElemH, nElemW, nElemH, &m_dcElement, 0, m_anMap[i][j] * nElemH, SRCCOPY);
}
}
}

}

另外注意利用vs2017加载资源文件时有可能在文件中看不到bmp文件,此时把列表中文件类型改为所有文件即可。

MFC 下拉列表

发表于 2018-05-28

   利用mfc要完成效果如图:

  • 创建mfc工程,选择对话框项目,选择资源文件的xxxx.rc2,进入后选择dialog,之后利用添加控件combobox
  • 右键控件,添加变量m_cbox
  • 添加控件Item,在OnInitDialog()中添加:

    1
    2
    m_cList1.AddString(L"jack1");
    m_cList1.AddString(L"jack2");

    或者直接在属性中data中添加,注意两个变量间要以;(分号)隔开

  • 获取变量内容:

    1
    2
    CString msg;
    m_cList1.GetLBText(m_cList1.GetCurSel(), msg);

    msg 是一个全局变量用于传递消息

  • button 设置显示内容:

    1
    2
    3
    UpdateData(TRUE);
    m_edit = msg+L"爱好"+msg2;
    UpdateData(FALSE);
  • Done

&nbsp ;&emsp ; 为空格,.=_=.(去掉分号与字母间的空格才可以)

《南方有乔木》

发表于 2018-05-17
用了一个下午看完了这本书,有点意思。
文中的时樾有点像《追龙》里面那个贩毒的。。。有义气。
时樾是要个很孝顺的人,每个月都会去看望他的母亲。
看到这一段时,我心里居然有点感触:
  “妈。”
  “嗯?”
  “以后要是我成了穷光蛋怎么办?”
  越秀英搅拌着青粥,爽朗的笑了起来:“穷光蛋?咱们本来不就是穷光蛋吗?”
  “那就不能给你买好吃的好穿的好用的了。”
  越秀英笑得更厉害了,朝隔壁房间一努嘴:“你自己看看,这些年来,给我带的东西,我除了手机,有啥用得上的啊?都快堆了一漫屋子了!”
她拿勺子点了点灶台,“米是自己种的,菜也是自己载的。有米有菜万事足,用的上你的?和你说过多少遍不要浪费,你还要买买买。。。。。败家子儿!”

如此煽情的一本书,如此优秀的男主角,是每个女孩都梦寐以求的吧!

南乔好单纯。

最后,常剑雄还是觉悟了。

她的感情和岁月,他从来不会辜负。

时樾将所有家产一并放弃的魄力还是很牛皮的。


《精进》

发表于 2018-05-16

有些好书,看一遍是不够的。
近期浮躁无比,重新翻了一翻。发现第一章时间管理讲的有点道理。

种树最佳时间是十年前,其次是现在。

五年时间,通常会使人跨越到下一个阶段,如果你愿意随波逐流,随遇而安,沿着最普遍最一般的人生轨迹前走,那么你不需要提前五年思考。

在沙坑里,我们总是一次次地把沙子抓起来,但刚得到一点快感,沙子就已经从之间滑下。即便这个过程重复再多次,我们还是会得到相同的结果。每一天都是崭新的一天,但每一天都重复昨天的“故事”。

收益值高低无关紧要,只要不是短半衰期的事情,只要这个受益值可以被累加,就尽管去做。
不要只盯着那些“高大上”的事。一些不重要,不紧急的事情,只要对你有长期的益处,就尽管去做。

所谓经典,就是有超长半衰期的事情。

如果一首交响曲从头到尾快到底,听后一定会喘不过气来。
1…91011…13
weihuan

weihuan

124 日志
4 分类
31 标签
© 2019 weihuan
由 Hexo 强力驱动
主题 - NexT.Muse